SSO單點登陸Spring-Security & CAS使用手冊

1.1概述

1.1.1單點登陸介紹

單點登陸(Single Sign On , 簡稱 SSO )是目前比較流行的服務於企業業務整合的解決方案之一, SSO 使得在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。CAS(Central Authentication Service)是一款不錯的針對 Web 應用的單點登陸框架。html

本文介紹了 CAS 的原理、協議、以及配合Spring-Security在 Tomcat 中的配置和使用。java

1.1.2 CAS 、Spring Security介紹

CAS 是 Yale 大學發起的一個開源項目,旨在爲 Web 應用系統提供一種可靠的單點登陸方法,CAS 在 2004 年 12 月正式成爲 JA-SIG 的一個項目。CAS 具備如下特色:mysql

  • 開源的企業級單點登陸解決方案。
  • CAS Server 爲須要獨立部署的 Web 應用。
  • CAS Client 支持很是多的客戶端(這裏指單點登陸系統中的各個 Web 應用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

Spring Security爲基於J2EE企業應用軟件提供了全面安全服務。Spring Security普遍支持各類身份驗證模式。 這些驗證模型絕大多數都由第三方提供,或正在開發的有關標準機構提供的,例如Internet Engineering Task Force。 做爲補充,Spring Security也提供了本身的一套驗證功能。git

1.1.3 CAS 原理和協議

從結構上看,CAS 包含兩個部分: CAS Server 和 CAS Client。CAS Server 須要獨立部署,主要負責對用戶的認證工做;CAS Client 負責處理對客戶端受保護資源的訪問請求,須要登陸時,重定向到 CAS Server。圖1 是 CAS 最基本的協議過程:github

圖 1. CAS 基礎協議web

ip_image001

CAS Client 與受保護的客戶端應用部署在一塊兒,以 Filter 方式保護受保護的資源。對於訪問受保護資源的每一個 Web 請求,CAS Client 會分析該請求的 Http 請求中是否包含 Service Ticket,若是沒有,則說明當前用戶還沒有登陸,因而將請求重定向到指定好的 CAS Server 登陸地址,並傳遞 Service (也就是要訪問的目的資源地址),以便登陸成功事後轉回該地址。用戶在第 3 步中輸入認證信息,若是登陸成功,CAS Server 隨機產生一個至關長度、惟1、不可僞造的 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 驗證的過程對於用戶是透明的。spring

另外,CAS 協議中還提供了 Proxy (代理)模式,以適應更加高級、複雜的應用場景,具體介紹能夠參考 CAS 官方網站上的相關文檔。sql

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/

lip_image003

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/

clipboard

出現上述界面,代表系統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

clipboard

keytool -delete -alias tomcat-cas-server -keystore "cacerts" -storepass changeit

keytool -delete -alias tomcat-cas-server -storepass changeit

clipboard

(註釋: 清除系統中可能存在的名字爲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

clipboard

(註釋: 列出系統證書倉庫中存在證書名稱列表)

keytool -genkey -validity 36000 -keyalg RSA -alias tomcat-cas-server -dname "cn=hello.cas.server" -storepass changeit

cn換成本身的域名

clipboard

(註釋:若是不指定證書文件的文件名和存放地址,默認位置爲用戶家目錄, 默認文件名 .keystore, 具體參數參見keytool命令。

[-validity <valDays>]爲證書有效期,指定使用RSA算法,生成別名爲tomcat-cas-server的證書,存貯口令爲changeit,也能夠保存其餘的口令!證書的DN爲"cn= test.cas.server ",這個DN必須同當前主機完整名稱一致哦,切記!!!)

clipboard

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/

clipboard

(註釋: 從keystore中導出別名爲tomcat-cas-server的證書,生成文件server.crt)

keytool -import -alias tomcat-cas-server -file "server.crt" -keystore "cacerts" -storepass changeit

clipboard

(註釋:將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

clipboard

(註釋:列出jre可信任證書倉庫中證書名單,驗證先前的導入是否成功,若是導入成功,應該在列表中能找到tomcat-cas-server這個別名)

在%JAVA_HOME%\jre\lib\security目錄下能找到「server.crt」這個文件;

clipboard

在用戶家目錄目錄下能找到「.keystore」文件。

拷貝.keystore到$CATALINA_HOME\conf下。

$CATALINA_HOME=tomcat安裝目錄

clipboard

--------------------------------------------------------------------------------------------------------------

clipboard

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" />

clipboard

重啓Tomcat,訪問https://hello.cas.server:8443/,出現如下界面說明HTTPS配置生效:

clipboard

clipboard

clipboard

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 已經部署成功。

clipboard

雖然 CAS Server 已經部署成功,但這只是一個缺省的實現,在實際使用的時候,還須要根據實際概況作擴展和定製,最主要的是擴展認證 (Authentication) 接口和 CAS Server 的界面。

注意:cas-server4.0以前的默認驗證規則:只要用戶名和密碼相同就認證經過

4.0 以後規則改了,默認是配置在 deployerConfigContext.xml 配置文件中,能夠看到用戶名密爲 casuser/Mellon

路徑:/usr/local/tomcat/webapps/cas/WEB-INF/deployerConfigContext.xml

clipboard

clipboard

clipboard

(注:目錄下給的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與之相同。

ip_image021

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).
web配置實例

舉例:

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/ ,如圖所示:

ip_image023

2. 點擊Secure page連接

瀏覽器會彈出安全提示,接受後即轉到 CAS 的登陸頁面,如圖所示:

ip_image024

3. 登陸成功後

再重定向到 springsecurity_cas_sample 的 Secure page 頁面,如所示:

ip_image026

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 官方網站。

相關文章
相關標籤/搜索