cas單點登陸學習:cas服務端與客戶端的搭建

單點登陸:英文名稱(Single Sign On),簡稱sso,是目前比較流行的服務於企業業務整合的解決方案之一,SSO 使得在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統html

 

而後,引用段話介紹一下cas特性(詳見http://www.360doc.com/content/15/0204/17/21706453_446251626.shtml):java

1) 開源的、多協議的SSO解決方案,CAS ServerCAS Client通訊支持多協議,如:CASOauthOpenIDSAML1.1SAML2.0D等。web

2) 支持多種認證機制:Active Directory、JAASJDBCLDAPX.509 Certificateswindows

3) 安全策略:使用票據(Ticket)來實現支持的認證協議;api

4) 支持多種客戶端:Java.NetPHPPerlApache、 uPortal等。tomcat

5) 支持受權:能夠決定哪些服務能夠請求和驗證服務票據(Service Ticket安全

6)  提供高可用性:經過把認證過的狀態數據存儲在TicketRegistry組件中,這些組件有不少支持分佈式環境的實現服務器

 

CAS包含CAS ServerCAS Client兩個部分。下面咱們看一看他的運行原理,首先借用一張cas經常使用的基礎協議流程圖session

大體流程是,在客戶機在在訪問cas客戶端時都須要請求服務端驚醒身份驗證,再驗證未經過是時,會被重定向至cas的服務端進行登錄,然後再次驗證,經過以後又重定向到客戶端界面。這裏只是一些文字描述,真正的實現咱們接下來看如何操做:app

首先,我須要介紹一下,配置cas的服務端有兩種方式:一種是http方式,另外一種是https方式。筆者這裏將演示如何配置https方式的cas服務端。

第一步咱們確定是須要準備咱們的原材料:筆者這裏用的是cas-server-4.0.7.war,tomcat7

首先須要的是導出你的證書,使用jdk的keytool工具,命令以下:

 

keytool -genkey -alias castest -keyalg RSA -keystore C:/key/casKey.keystore

 

 這裏是生成你的keystore文件,C:/key/casKey.keystore是指文件生成路徑,即c盤下的key文件夾下生成casKey.store文件,注意文件夾必定要存在這裏你會輸入你的證書信息,注意口令爲你的密碼,用戶名將爲你後期配置服務端請求的域名

 

 

第二步導出crt文件:

keytool -export -file C:/key/casKey.crt -alias castest -keystore C:/key/casKey.keystore

 

執行完這兩步,你將生成兩個文件:

第三步:將生成的證書導入你的運行jdk中:

keytool -import -keystore "C:/Program Files/Java/jdk1.8.0_131/jre/lib/security/cacerts" -file C:/key/casKey.crt -alias castest

 

這裏須要注意的是你的路徑必定要爲你的jdk->jre->lib->security,若是你的路徑下存在此文件,則須要將其刪除,再執行導入,密鑰庫口令默認爲changeit

而後將生成的證書文件文件拷貝至jdk->bin下,在c://windows/System32/drivers/etc/hosts文件中添加你的域名映射,沒有該文件需建立一個hosts文件,添加內容以下

127.0.0.1 sso.castest.com

 

 接下來就開始配置tomcat環境了,首先將你的cas-server-4.0.7.war拷貝至tomcat的webapps下,更名爲cas.war。打開tomcat->conf->server.xml,找到以下內容:

將其反註釋,修改成:

<Connector port="8086" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile="C:/key/casKey.keystore" keystorePass="casDemo" />

 

 這裏須要注意:keystoreFile爲你第一步生成的keystore文件的位置,keystorePass爲你第一步輸入的口令密碼,不是changeit

接下來作個測試,啓動tomcat,輸入地址https://sso.castest.com:8086/cas/,出現以下界面

添加好信任以後,進入以下界面,則說明服務端配置成功:

ok,以上步驟若是沒有成功,請仔細檢查以前步驟。成功了以後,恭喜,那就能夠進入客戶端端的配置了,首先,下載服務端架包,這裏用的是cas-client-core-3.2.1.jar,而後準備一個測試tomcat,用來測試單點登陸,建立一個web項目,取名爲casDemo001

pom.xml加入以下:

<dependency>
        <groupId>org.jasig.cas.client</groupId>
        <artifactId>cas-client-core</artifactId>
        <version>3.2.1</version>
    </dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>

 

 web.xml文件以下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <!-- ======================== 單點登陸開始 ======================== -->
    <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->
    <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://sso.castest.com:8086/cas/login</param-value>
        </init-param>
        <!--
            指定客戶端的域名和端口,是指客戶端應用所在機器而不是 CAS Server 所在機器如下配置表示,
            系統部署在域名爲shirui-55的機器上,端口爲80 
        -->
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8111</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://sso.castest.com:8086/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8111</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>
    
        
        <!-- ======================== 單點登陸結束 ======================== -->

        <!-- session超時定義,單位爲分鐘 -->
        <session-config>
                <session-timeout>2</session-timeout>
        </session-config>

</web-app>
        

 

 這裏需注意的是關於兩個casServer的url的編寫

啓動tomcat(須要修改端口號,要否則後報端口號被佔用錯誤,這裏修改成8111,固然你能夠根據本身的愛好修改,對這裏來講無關痛癢),將項目運行,啓動成功後輸入地址:localhost:8111/casDemo001/,出現以下界面

這就證實配置成功了,你的請求已經被攔截,而且正確的跳到了你的cas服務器登陸界面,輸入帳號密碼:casuser     Mellon(這是cas默認的登陸帳戶,配置數據驗證的話下一篇博文會講述),登錄後出現以下界面:

 

 

 

 

而後刷新cas服務端的界面,出現以下圖界面:

 

至此,cas服務端與客戶端的配置已經完成,服務端文件下載連接連接:https://pan.baidu.com/s/1qY1H0aK    密碼:7e52

相關文章
相關標籤/搜索