前言css
不瞭解單點登陸的能夠看個人另外一個文章 「單點登陸整合方案」html
都是本身的理解,歡迎各位指正。java
大概結構以下:web
JDK1.7 + CAS SERVER 3.5 + ORACLE + JAVA WEB spring
1.安裝JDK1.7sql
因爲個人cas-tomcat是基於JDK1.7,因此首先必需要有JDK1.7環境apache
2.生成證書瀏覽器
1)生成密鑰庫tomcat
keytool -genkey -alias tomcat -keyalg RSA -keypass 123456 -storepass 123456 -keystore /usr/java/key/server.keystore -validity 3600 服務器
tomcat 爲我本地的域名,這裏不能輸入IP,因此這裏記得在host文件裏配置下。
server.keystore 爲生成的密鑰。
這裏對應的6個問題:
1.單點登陸服務器的域名
2.公司名稱
3.單點登陸服務名稱
4.剩下的就是所在地信息
2)導出證書
keytool -export -trustcacerts -alias tomcat -file /usr/java/key/server.cer -keystore /usr/java/key/server.keystore -storepass 123456
server.cer 爲導出的證書
3)導出證書到jdk(tomcat運行的jvm)
keytool -import -trustcacerts -alias tomcat -file /usr/java/key/server.cer -keystore /usr/java/jdk1.7.0_75/jre/lib/security/cacerts -storepass 123456
在作這一步的時候,出現一個問題。當我輸入密碼123456到jre下的security時,會報錯密碼不正確,上圖:
可是當我將cacerts輸出到別的路徑時就沒問題。上圖:
有知道的朋友麻煩告知下。
最後我試了下changeit這個密碼,成功添加到目標路徑。上圖:
這裏跟你們說一下,changeit爲jre的默認密碼。
3.配置tomcat(cas-tomcat)
找到conf/server.xml,找到以下代碼:
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8453" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/home/key/server.keystore" <!-- 這裏是key的路徑 -->
keystorePass="123456"/>
修改黃色部分。
4.下載CAS SERVER,我這裏是cas-server-3.5.2
解壓到cas-tomcat/webapps下。
將cas-server-3.5.2修更名稱爲cas
4.測試cas
啓動tomcat,進入tomcat/bin,執行startup.bat。
輸入 https://me.com:8443/cas/login,若是提示https鏈接失敗,嘗試將證書導入到瀏覽器中。
CAS默認的登錄驗證規則是用戶名和密碼一致便可。
到這裏爲止,咱們已經搭建了一個最近簡單的cas應用。
實際項目中,咱們的登錄驗證不能像上面這麼簡單,因此往下看。
首先打開cas-tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml
配置以下幾個地方:
(1)註釋掉 <property name="attributeRepository" ref="attributeRepository" />
(2)註釋掉<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
而後加上
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property ref="dataSource" name="dataSource" />
<property name="sql" value="select password from USER_ where login_name=?" />
</bean>
這裏的sql對應的是查詢的用戶,dataSource在後面配置。
(3)在beans標籤內再配置個bean
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@192.168.215.177:1521:CPS1"></property>
<property name="username" value="gsmdba"></property>
<property name="password" value="gsmdba"></property>
</bean>
以上爲配置數據源。
配置完,咱們再登錄一次,我這邊添加了一條用戶數據zhangsan/123456,嘗試登錄,成功。
下面咱們來將單點登錄集成到咱們的Java web中。
(1)首先新建一個web工程 Test_Servlet
(2)新建一個Servlet
package com.org.servlet;
import java.io.IOException;
import java.security.Principal;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 編寫測試類 繼承Servlet類,重寫init()方法
*
* @author Administrator
*
*/
public class HelloWorld extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void init() {
System.out.println("init......");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取單點登陸用戶信息
Principal principal = request.getUserPrincipal();
String userName = principal.getName();
System.out.println("userName : " + userName);
}
}
(3)修改index.jsp頁面,添加一個a標籤指向Servlet
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
<a href="<%=basePath%>HelloWorld/helloServlet?userName=scott&userPwd=tiger">HelloWorld</a>
</body>
</html>
(4)修改web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.org.servlet.HelloWorld</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld/helloServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 單點登出 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 單點登出 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 單點登陸 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://me.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8180</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Ticket校驗 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://me.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8180</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 實現HttpServletRequest請求的包裹,好比容許開發者經過HttpServletRequest的getRemoteUser()方法得到SSO登陸用戶的登陸名 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 能夠經過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登陸名。 好比AssertionHolder.getAssertion().getPrincipal().getName() -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ok,到這裏爲止,咱們的Java Web工程的配置已經完成。
接下來咱們須要將證書導入到Java Web用到的JDK中。
這裏我將server.cer放在了bin的上一級目錄中,因此命令以下:
keytool -import -trustcacerts -alias tomcat -file ..\server.cer -keystore ..\jre\lib\security\cacerts -storepass changeit
若是這裏已經存在名稱爲tomcat的驗證,則須要先刪除掉,命令以下:
keytool -delete -trustcacerts -alias tomcat -file ..\server.cer -keystore ..\jre\lib\security\cacerts -storepass changeit
證書導出成功後。咱們就能夠進行測試了。
輸入 http://me.com:8180/Test_Servlet 會跳轉到cas登錄界面,而後輸入用戶密碼,登錄成功則會進入index.jsp界面,而後咱們點擊Hello World標籤,跳轉到Servlet中,後臺會打印當前用戶爲 'zhangsan'
這裏須要注意的是,web.xml配置的路徑,必定要使用域名,不然會報錯:java.security.cert.CertificateException: No subject alternative names present
參考自:http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html