1.1概述
1.1.1單點登錄介紹
單點登錄(Single Sign On , 簡稱 SSO )是目前比較流行的服務於企業業務整合的解決方案之一, SSO 使得在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。CAS(Central Authentication Service)是一款不錯的針對 Web 應用的單點登錄框架。
本文介紹了 CAS 的原理、協議、以及配合Spring-Security在 Tomcat 中的配置和使用。
1.1.2 CAS 、Spring Security介紹
CAS 是 Yale 大學發起的一個開源項目,旨在為 Web 應用系統提供一種可靠的單點登錄方法,CAS 在 2004 年 12 月正式成為 JA-SIG 的一個項目。CAS 具有以下特點:
- 開源的企業級單點登錄解決方案。
- CAS Server 為需要獨立部署的 Web 應用。
- CAS Client 支持非常多的客戶端(這里指單點登錄系統中的各個 Web 應用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
Spring Security為基於J2EE企業應用軟件提供了全面安全服務。Spring Security廣泛支持各種身份驗證模式。 這些驗證模型絕大多數都由第三方提供,或正在開發的有關標准機構提供的,例如Internet Engineering Task Force。 作為補充,Spring Security也提供了自己的一套驗證功能。
1.1.3 CAS 原理和協議
從結構上看,CAS 包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署,主要負責對用戶的認證工作;CAS Client 負責處理對客戶端受保護資源的訪問請求,需要登錄時,重定向到 CAS Server。圖1 是 CAS 最基本的協議過程:
圖 1. CAS 基礎協議
CAS Client 與受保護的客戶端應用部署在一起,以 Filter 方式保護受保護的資源。對於訪問受保護資源的每個 Web 請求,CAS Client 會分析該請求的 Http 請求中是否包含 Service Ticket,如果沒有,則說明當前用戶尚未登錄,於是將請求重定向到指定好的 CAS Server 登錄地址,並傳遞 Service (也就是要訪問的目的資源地址),以便登錄成功過后轉回該地址。用戶在第 3 步中輸入認證信息,如果登錄成功,CAS Server 隨機產生一個相當長度、唯一、不可偽造的 Service Ticket,並緩存以待將來驗證,之后系統自動重定向到 Service 所在地址,並為客戶端瀏覽器設置一個 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新產生的 Ticket 過后,在第 5,6 步中與 CAS Server 進行身份合適,以確保 Service Ticket 的合法性。
在該協議中,所有與 CAS 的交互均采用 SSL 協議,確保,ST 和 TGC 的安全性。協議工作過程中會有 2 次重定向的過程,但是 CAS Client 與 CAS Server 之間進行 Ticket 驗證的過程對於用戶是透明的。
另外,CAS 協議中還提供了 Proxy (代理)模式,以適應更加高級、復雜的應用場景,具體介紹可以參考 CAS 官方網站上的相關文檔。
1.2 術語定義
SSO : 單點登錄(Single Sign On , 簡稱 SSO )
CAS : CAS(Central Authentication Service)是一款不錯的針對 Web 應用的單點登錄框架
認證 : 是為用戶建立一個他所聲明的主體。 主體一般是指用戶,設備或可以在你系統中執行行動的其他系統。
授權 : 指的一個用戶能否在你的應用中執行某個操作。 在到達授權判斷之前,身份的主體已經由身份驗證過程建立了。
認證和授權是通用的,不是Spring Security特有的。
1.3 參考資料
http://www.ja-sig.org/products/cas/
http://www.ja-sig.org/wiki/display/CASUM/Home
http://static.springframework.org/spring-security/site/index.html
http://family168.com/tutorial/springsecurity/html/springsecurity.html
--------------------------------------------------------------------------------------------------------
http://www.cnblogs.com/vhua/p/cas_1.html
http://blog.csdn.net/small_love/article/details/6664831
http://steven-wiki.readthedocs.io/en/latest/security/cas-tomcat/
http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/
2 CAS Server安裝部署
2.1准備工作
OS: Centos6
JDK: 1.8.0_11
Web Server: Tomcat-7.0.73
CAS Server: cas-server-4.0.0
下載鏈接:
http://tomcat.apache.org/download-70.cgi
https://github.com/apereo/cas/releases?after=v4.0.2
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
2.2開始部署 CAS Server
CAS Server 是一套基於 Java 實現的服務,該服務以一個 Java Web Application 單獨部署在與 servlet2.3 兼容的 Web 服務器上,另外,由於 Client 與 CAS Server 之間的交互采用 Https 協議,因此部署 CAS Server 的服務器還需要支持 SSL 協議。當 SSL 配置成功過后,像普通 Web 應用一樣將 CAS Server 部署在服務器上就能正常運行了,不過,在真正使用之前,還需要擴展驗證用戶的接口。
在 Tomcat 上部署一個完整的 CAS Server 主要按照以下幾個步驟:
2.2.1 配置 Tomcat 使用 Https 協議
如果希望 Tomcat 支持 Https,主要的工作是配置 SSL 協議,其配置過程和配置方法可以參考 Tomcat 的相關文檔。不過在生成證書的過程中,會有需要用到主機名的地方,CAS 建議不要使用 IP 地址,而要使用機器名或域名。
為了實現SSL,一個Web服務必須對每一個接受安全連接的外部接口或者IP地址有一個相關聯的證書,數字證書的獲取一般從像verisign或者Thawte這樣的著名證書頒發機構(Certificate Authority CA)購買證書,或者如果身份驗證並不很重要,比如管理員只是希望保證服務器發送和接收的數據是私有的並且不能被連接中的任何竊聽者探聽到,則可以只是使用自簽名的證書,從而省去獲取CA證書的時間和成本。此處使用自簽名證書作為客戶端與服務器端安全通信的憑證。
1. 安裝JDK1.8
2. 安裝tomcat7
3. 設置環境變量JAVA_HOME
安裝完畢,啟動Tomcat ,在瀏覽器上 測試 http://localhost:8080/
出現上述界面,表明系統tomcat成功搭建。
4. 使用Java Keytool工具為系統生成HTTPS證書,並為系統注冊
cd $JAVA_HOME/jre/lib/security/
cd /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-0.b15.el6_8.x86_64/jre/lib/security
keytool -delete -alias tomcat-cas-server -keystore "cacerts" -storepass changeit
keytool -delete -alias tomcat-cas-server -storepass changeit
(注釋: 清除系統中可能存在的名字為tomcat-cas-server的同名證書,“changeit”是jdk中證書的默認密碼,如果系統中無tomcat-cas-server名稱的證書,則彈出錯誤警告信息,不用理會)
keytool -list -keystore "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-0.b15.el6_8.x86_64/jre/lib/security/cacerts" -storepass changeit
(注釋: 列出系統證書倉庫中存在證書名稱列表)
keytool -genkey -validity 36000 -keyalg RSA -alias tomcat-cas-server -dname "cn=hello.cas.server" -storepass changeit
cn換成自己的域名
(注釋:如果不指定證書文件的文件名和存放地址,默認位置為用戶家目錄, 默認文件名 .keystore, 具體參數參見keytool命令。
[-validity <valDays>]為證書有效期,指定使用RSA算法,生成別名為tomcat-cas-server的證書,存貯口令為changeit,也可以保存其他的口令!證書的DN為"cn= test.cas.server ",這個DN必須同當前主機完整名稱一致哦,切記!!!)
keytool -export -alias tomcat-cas-server -file "$JAVA_HOME/jre/lib/security/server.crt" -storepass changeit
$JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-0.b15.el6_8.x86_64/
(注釋: 從keystore中導出別名為tomcat-cas-server的證書,生成文件server.crt)
keytool -import -alias tomcat-cas-server -file "server.crt" -keystore "cacerts" -storepass changeit
(注釋:將server.crt導入jre的可信任證書倉庫。注意,安裝JDK是有兩個jre目錄,一個在jdk底下,一個是獨立的jre,這里的目錄必須同Tomcat使用的jre目錄一致,否則后面Tomcat的HTTPS通訊就找不到證書了)
重點:保存該server.crt證書,CAS Client端部署的時候同樣需要導入該證書。這樣CAS Server和Cas Client才能通過“握手”驗證。
keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit > list.txt
(注釋:列出jre可信任證書倉庫中證書名單,驗證先前的導入是否成功,如果導入成功,應該在列表中能找到tomcat-cas-server這個別名)
在%JAVA_HOME%\jre\lib\security目錄下能找到“server.crt”這個文件;
在用戶家目錄目錄下能找到“.keystore”文件。
拷貝.keystore到$CATALINA_HOME\conf下。
$CATALINA_HOME=tomcat安裝目錄
--------------------------------------------------------------------------------------------------------------
5. 配置Tomcat的HTTPS服務
編輯%CATALINA_HOME%\conf下的server.xml文件,修改<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->下面的http1.1配置,
<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8443" minSpareThreads="5" maxSpareThreads="75" enableLookups="true" disableUploadTimeout="true" acceptCount="100" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="conf/.keystore" keystorePass="changeit" clientAuth="false" sslProtocol="TLS" /> <!-- keystoreFile 指定證書位置,如果不指定默認位置為用戶加目錄下.keystore --> <!—keystorePass你生成證書時的口令 -->
<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8443" minSpareThreads="5" maxSpareThreads="75" enableLookups="true" disableUploadTimeout="true" acceptCount="100" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="conf/.keystore" keystorePass="changeit" clientAuth="false" sslProtocol="TLS" useBodyEncodingForURI="true" />
重啟Tomcat,訪問https://hello.cas.server:8443/,出現以下界面說明HTTPS配置生效:
2.2.2部署 CAS WAR
CAS Server 是一個 Web 應用包,將解壓后的文件夾中的 /module中的 cas-server-webapp-4.0.0.war 復制到 tomcat的 webapps 目錄。將拷貝后的war文件重命名成 cas.war (會在webapps文件夾下自動解壓出 cas 文件夾, 下文中將用%CAS_SERVER_HOME%來表示這個文件夾),由於前面已配置好 tomcat 的 https 協議,可以重新啟動 tomcat,然后訪問:https:// hello.cas.server:8443/cas ,如果能出現正常的 CAS 登錄頁面,則說明 CAS Server 已經部署成功。
雖然 CAS Server 已經部署成功,但這只是一個缺省的實現,在實際使用的時候,還需要根據實際概況做擴展和定制,最主要的是擴展認證 (Authentication) 接口和 CAS Server 的界面。
注意:cas-server4.0之前的默認驗證規則:只要用戶名和密碼相同就認證通過
4.0 之后規則改了,默認是配置在 deployerConfigContext.xml 配置文件中,可以看到用戶名密為 casuser/Mellon
路徑:/usr/local/tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml
(注:目錄下給的cas.war里面已經包含了簡單的jdbc配置,並且已經包含需要的jar包,配置人員配置時需要留意,參考修改配置。原war包可以從cas-server-4.0.0-release.zip下cas-server-4.0.0/ modules/ cas-server-webapp-4.0.0.war獲得)
2.3擴展認證接口- JDBC 認證方法
用戶的認證信息通常保存在數據庫中,因此本文就選用這種情況來介紹。將前面下載的 cas-server-4.0.0-release.zip 包解開后,在 modules 目錄下可以找到包 cas-server-support-jdbc-4.0.0.jar,其提供了通過 JDBC 連接數據庫進行驗證的缺省實現,基於該包的支持,我們只需要做一些配置工作即可實現 JDBC 認證。
JDBC 認證方法支持多種數據庫,DB2, Oracle, MySql, Microsoft SQL Server 等均可,這里以 mysql 作為例子介紹。並且假設mysql數據庫名: test,數據庫登錄用戶名: root,數據庫登錄密碼: 12345,用戶信息表為: users。
DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `enabled` char(1) NOT NULL DEFAULT 'Y', PRIMARY KEY (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
記住這里的表名users 和字段(username,password,enabled),后面要用到。
Insert into users values ('jim','12345', 'Y'); Insert into users values ('marry', '54321', 'Y');
1. 配置 DataStore
打開文件 %CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xml,添加一個新的 bean 標簽,對於 mysql,內容如下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> <property name="url"><value>jdbc:mysql://127.0.0.1:3306/test</value></property> <property name="username"><value>root</value></property> <property name="password"><value>12345</value></property> </bean>
其中 id 屬性為該 DataStore 的標識,在后面配置 AuthenticationHandler 會被引用,另外,需要提供 DataStore 所必需的數據庫驅動程序、連接地址、數據庫登錄用戶名以及登錄密碼。
2. 配置 AuthenticationHandler
在 cas-server-support-jdbc-4.0.0.jar包中,提供了 3 個基於 JDBC 的 AuthenticationHandler,分別為 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其中 BindModeSearchDatabaseAuthenticationHandler 是用所給的用戶名和密碼去建立數據庫連接,根據連接建立是否成功來判斷驗證成功與否;QueryDatabaseAuthenticationHandler 通過配置一個 SQL 語句查出密碼,與所給密碼匹配;SearchModeSearchDatabaseAuthenticationHandler 通過配置存放用戶驗證信息的表、用戶名字段和密碼字段,構造查詢語句來驗證。
使用哪個 AuthenticationHandler,需要在 deployerConfigContext.xml 中設置,默認情況下,CAS 使用一個簡單的 username=password 的 AuthenticationHandler,在文件中可以找到如下一行:<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />,我們可以將其注釋掉,換成我們希望的一個 AuthenticationHandler,這里我們使用QueryDatabaseAuthenticationHandle,如下。
使用 QueryDatabaseAuthenticationHandler
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="dataSource" /> <property name="sql" value="select password from users where username=? and enabled='Y'" /> </bean> <!—用到了上面定義的表名和字段-->
3. 部署依賴包
在以上配置完成以后,需要拷貝幾個依賴的包到 cas 應用下,包括:
- 將 cas-server-support-jdbc-4.0.0.jar 拷貝到 %CATALINA_HOME%/webapps/cas/ WEB-INF/lib 目錄。
- 數據庫驅動,由於這里使用 mysql,將 mysql-connector-java-5.1.5-bin.jar 拷貝到 %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目錄。對於其他數據庫,同樣將相應數據庫驅動程序拷貝到該目錄。
- DataStore 依賴於 commons-collections-3.2.jar, commons-dbcp-1.2.1.jar, commons-pool-1.3.jar,需要到 apache 網站的 Commons 項目下載以上 3 個包放進 %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目錄。
- 注:目錄下給的cas.war里面已經包含了簡單的jdbc配置,並且已經包含需要的jar包,配置人員配置時需要留意,參考修改配置。原war包可以從cas-server-4.0.0-release.zip下cas-server-4.0/ modules/ cas-server-webapp-4.0.0.war獲得。
2.4 擴展 CAS Server 界面
Demo先只應用cas server提供的默認登陸等頁面,如后續需要修改相關頁面,需要修改對應的view頁面, 需要重新部署war包,CAS 的頁面采用 Spring 框架編寫(頁面是Spring MVC),對於不熟悉 Spring 的開發者,在修改之前需要熟悉該框架。
參考鏈接:
http://www.cnblogs.com/vhua/p/cas_2.html
http://www.cnblogs.com/vhua/p/cas_3.html
3. 部署Spring Security應用
3.1准備工作
包括2.1的基本准備相關
spring-security-2.0.3.zip
cas-client-core-3.1.3.jar
重點:向CAS Server部署人員索取server.crt證書。然后導入該證書,這樣CAS Server和Cas Client才能通過“握手”驗證。
參考:
keytool -import -alias tomcat-cas-server -file "%JAVA_HOME%/jre/lib/security/server.crt" -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit
(注釋:將server.crt導入jre的可信任證書倉庫。注意,安裝JDK是有兩個jre目錄,一個在jdk底下,一個是獨立的jre,這里的目錄必須同Tomcat使用的jre目錄一致,否則后面Tomcat的HTTPS通訊就找不到證書了)
3.2開始部署Spring Security
3.2.1 開場簡單介紹
單點登錄的目的是為了讓多個相關聯的應用使用相同的登錄過程,本文構造 2個簡單的應用,來講解如何部署spring-security & cas客戶端子系統,分別以 springsecurity_cas_sample 和 springsecurity_cas_sample_brother 來作為示例,它結構相同,這 2 個應用使用同一套登錄信息,並且只有登錄過的用戶才能訪問。任何人都可以訪問首頁面, secure和extreme頁面需要登陸驗證,一旦經過驗證,兩個系統之間無須再次登陸驗證。通過配置,實現單點登錄,即只需登錄一次就可以訪問這兩個應用。
下圖為springsecurity_cas_sample的結構,springsecurity_cas_sample_brother與之相同。
3.2.2配置 CAS Filter
准備好springsecurity_cas_sample和 springsecurity_cas_sample_brother過后,分別部署在 B 和 C 機器上,這里假設CAS Server機器為A。由於 springsecurity_cas_sample和 springsecurity_cas_sample_brother,B 和 C 完全等同,我們以 springsecurity_cas_sample 在 B 機器上的配置做介紹,根據上文的cas server的配置,假設 A 和 B 的域名分別為 domainA為hello.cas.server:8443 和 domainB為hello.cas.server:8080 (由於筆者只有一台機器)。
將 casclient.jar,cas-client-core-3.1.3.jar,spring-security-cas-client-2.0.3.jar,spring-security-core-2.0.3.jar,spring.jar,log4j-1.2.15.jar,mysql-connector-java-5.1.5-bin.jar 並拷貝到 /WEB-INF/lib目錄下,修改 web.xml 文件,添加 CAS Filter,如下所示:

<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext-security.xml </param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/log4j.properties</param-value> </context-param> <context-param> <param-name>log4jExposeWebAppRoot</param-name> <param-value>false</param-value> </context-param> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- - Loads the root application context of this web app at startup. - The application context is then available via - WebApplicationContextUtils.getWebApplicationContext(servletContext). --> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- - Publishes events for session creation and destruction through the application - context. Optional unless concurrent session control is being used. --> <listener> <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class> </listener>
Web.xml中,Spring-Security 的applicationContext-security.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"> <!--xmlns:sec="http://www.springframework.org/schema/security" --> <!--定義security 的命名空間是sec--> <sec:http entry-point-ref="casProcessingFilterEntryPoint"> <sec:intercept-url pattern="/secure/extreme/**" access="ROLE_SUPERVISOR" /> <sec:intercept-url pattern="/secure/**" access="ROLE_USER" /> <sec:logout logout-success-url="/cas-logout.jsp"/> </sec:http> <!--定義secure受保護頁,和訪問角色,具體用戶角色定義在上文的jdbc中有介紹。 --> <sec:authentication-manager alias="authenticationManager"/> <bean id="casProcessingFilter" class="org.springframework.security.ui.cas.CasProcessingFilter"> <sec:custom-filter after="CAS_PROCESSING_FILTER"/> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationFailureUrl" value="/casfailed.jsp"/> <property name="defaultTargetUrl" value="/"/> </bean> <!--authenticationFailureUrl登陸失敗時轉向的頁面 defaultTargetUrl登陸成功時轉向的頁面 --> <bean id="casProcessingFilterEntryPoint" class="org.springframework.security.ui.cas.CasProcessingFilterEntryPoint"> <property name="loginUrl" value="https://hello.cas.server:8443/cas/login"/> <property name="serviceProperties" ref="serviceProperties"/> </bean> <!-- loginUrl定義CAS server登陸頁面,A的地址--> <bean id="casAuthenticationProvider" class="org.springframework.security.providers.cas.CasAuthenticationProvider"> <sec:custom-authentication-provider /> <property name="userDetailsService" ref="userService"/> <property name="serviceProperties" ref="serviceProperties" /> <property name="ticketValidator"> <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator"> <constructor-arg index="0" value="https://hello.cas.server:8443/cas" /> </bean> </property> <property name="key" value="an_id_for_this_auth_provider_only"/> </bean> <bean id="proxyGrantingTicketStorage" class="org.jasig.cas.client.proxy.ProxyGrantingTicketStorageImpl" /> <bean id="serviceProperties" class="org.springframework.security.ui.cas.ServiceProperties"> <property name="service" value="http://hello.cas.server:8080/springsecurity_cas_sample/j_spring_cas_security_check"/> <property name="sendRenew" value="false"/> </bean> <!-- service定義子系統server地址,B的地址--> <sec:jdbc-user-service data-source-ref="dataSource" id="userService" users-by-username-query="select myusername,myauthority,1 from authorities_sub1 where myusername=?" authorities-by-username-query="select myusername,myauthority from authorities_sub1 where myusername=?" /> <!-- service定義子系統的權限表,必須包含用戶名字段和權限字段,權限字段的值必須以ROLE_開頭,應用的數據庫在后面(dataSource).
舉例:
CREATE TABLE `authorities_sub1` ( `myusername` varchar(50) NOT NULL, `myauthority` varchar(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into authorities_sub1 values('marry', 'ROLE_USER'); insert into authorities_sub1 values('jim', 'ROLE_SUPERVISOR'); insert into authorities_sub1 values('jim', 'ROLE_USER'); --> <!—采用jdbc方式獲得用戶權限,這里默認管理的用戶和權限表為上文jdbc配置的表--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/subdb"/> <property name="username" value="root"/> <property name="password" value="12345"/> </bean> <!-- service定義子通過jdbc連接數據庫,連接自定義需要連接的數據庫,用戶名,密碼--> </beans>
在上面所有配置結束過后,分別在 A, B, C上啟動tomcat(由於筆者只有一台機器,故一次啟動), springsecurity_cas_sample 和 springsecurity_cas_sample_brother,按照下面步驟來訪問 springsecurity_cas_sample和 springsecurity_cas_sample_brother:
1. 打開瀏覽器
訪問 http://hello.cas.server:8080/springsecurity_cas_sample/ ,如圖所示:
2. 點擊Secure page鏈接
瀏覽器會彈出安全提示,接受后即轉到 CAS 的登錄頁面,如圖所示:
3. 登錄成功后
再重定向到 springsecurity_cas_sample 的 Secure page 頁面,如圖 所示:
4. 再在同一個瀏覽器中
點擊 springsecurity_cas_sample_brother/secure/index.jsp鏈接 ,系統不再提示用戶登錄,而直接出現如圖所示的頁面,並且顯示在 springsecurity_cas_sample 中已經登錄過的用戶。
5. 反之先登陸springsecurity_cas_sample_brother
再登陸springsecurity_cas_sample效果一樣。
springsecurity_cas_sample和springsecurity_cas_sample_brother代碼程序在svn上
svn://192.168.0.5/research/trunk/SSO/springsecurity_cas_sample
svn://192.168.0.5/research/trunk/SSO/springsecurity_cas_sample_brother
3.3 Spring-Security子系統API
為輔助開發,提供api如下,SSOUtil.java

/******************************************************************/ /** * 獲得當前登錄用戶名 (推薦) * @param * @return 當前用戶名 * @throws Exception */ public static String getCurrentUserName(); /******************************************************************/ /** * 獲得當前登錄用戶名 * @param request * @return 當前用戶名 * @throws Exception */ public static String getCurrentUserName(HttpServletRequest request); /******************************************************************/ /** * 獲得當前登錄用戶擁有的所有role(推薦) * @param * @return 角色數組 * @throws Exception */ public static String[] getCurrentUserRoles(); /******************************************************************/ /** * 獲得當前登錄用戶擁有的所有role * @param request * @return 角色數組 * @throws Exception */ public static String[] getCurrentUserRoles(HttpServletRequest request); /******************************************************************/ /** * 判斷當前登錄用戶的角色是否是指定的role * @param request * @param role * @return boolean * @throws Exception */ public static boolean isCurrentUserRole(HttpServletRequest request, String role)
結束語
本文介紹了 CAS 單點登錄解決方案的原理,並結合實例講解了在 Tomcat 中使用 CAS & Spring Security的配置、部署方法以及效果。CAS 是作為開源單點登錄解決方案的一個不錯選擇,更多的使用細節可以參考 CAS 官方網站。