搭建CAS單點登錄服務器


  最近公司的一個項目需要用到單點登錄的功能,之前對單點登錄了解得不多。於是網上找了下單點登錄的解決方案,發現CAS是個不錯的解決方案。於是搭個環境測試了一下。這里記錄下測試的詳細步驟。

  官網:http://jasig.github.io/cas/

  Cas Server下載:http://developer.jasig.org/cas/

  Cas Client下載:http://developer.jasig.org/cas-clients/

  測試環境:

    jdk:java version "1.8.0_60"

    tomcat:apache-tomcat-7.0.65

    mysql:mysql5.5.40

    CAS Server:cas-server-4.0.0-release.zip

    CAS Client:cas-client-3.1.12-release.zip

  此教程是在jdk和tomcat成功安裝的基礎上完成,至於jdk和tomcat的安裝大家可以網上找找資料。好吧,下面入正題。

  一、生成證書

  1、生成證書:

    keytool -genkey -alias castest -keyalg RSA -keystore F:/keys/castest

    生成一個別名為castest的證書。

    此處需要特別注意口令(后續導入導出證書、CAS服務器端均要用到此口類)和“名字與姓氏”(為CAS跳轉域名,否則會報錯)

    

  2、導出證書:

    keytool -export -file F:/keys/castest.crt -alias castest -keystore F:/keys/castest

  3、將證書導入到客戶端JRE中(注意、是導入JRE中),如果security中已經存在cacerts,需要先將其刪除。

    keytool -import -keystore "D:\Program Files\Java\jdk1.8.0_60\jre\lib\security\cacerts" -file F:/keys/castest.crt -alias castest

  二、配置服務器端

  1、從http://developer.jasig.org/cas/上下載cas服務器端cas-server-4.0.0-release.zip,在modules目錄下找到cas-server-webapp-4.0.0.war,將其復制到%TOMCAT_HOME%\webapps下,並將名稱改為cas.war

  2、修改%TOMCAT_HOME%\conf\server.xml文件,去掉此文件83到93行之間的注釋,修改為:

<Connector SSLEnabled="true" clientAuth="false" keystoreFile="F:/keys/castest" <!—生成證書時的路徑,證書名-->
keystorePass="castest" <!—證書密碼-->
maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>

  3、測試:https://localhost:8443/

  

  點擊繼續瀏覽此網頁

  

  如果此時可以正常訪問,說明證書安裝成功

  https://localhost:8443/cas/login,出現

  

  輸入賬號和密碼

  casuser
  Mellon

  

  此時說明服務器端已經配置成功。可通過https://localhost:8443/cas/logout退出登錄

  三、配置客戶端

  1. 從http://developer.jasig.org/cas-clients/上下載cas-client-3.1.12-release.zip,在modules目錄下找到cas-client-core-3.1.12.jar、commons-collections-3.2.jar、commons-logging-1.1.jar復制到項目WEB-INF/lib下

  2. 添加映射域名,在C:\Windows\System32\drivers\etc\hosts文件中添加

    127.0.0.1 sso.castest.com
  3. 創建web項目CasClient,並在項目的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">

        <display-name>cas-demo</display-name>
        
        <!-- ======================== 單點登錄開始 ======================== -->
        <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->
        <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>/CasClient/*</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:8443/cas/login</param-value>
                        <!--這里的server是服務端的IP-->
                </init-param>
                <init-param>
                        <param-name>serverName</param-name>
                        <param-value>http://localhost:8080</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:8443/cas/</param-value><!-- 此處必須為登錄url/cas/,帶有任何其它路徑都會報錯,如“https://sso.castest.com:8443/cas/login”,這樣也會報錯。 -->
                </init-param>
                <init-param>
                        <param-name>serverName</param-name>
                        <param-value>http://localhost:8080</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>

  4. 此時訪問http://localhost:8080/CasClient/Index.jsp時會自動跳轉到sso.castest.com下去登錄

  

  輸入賬號和密碼casuser:Mellon

  

  此時客戶端已安裝成功。

  可以用類似的方式新建多個站點,站點1登錄以后站點而無需登錄也可訪問,如果未登錄則會跳轉到相應的url進行登錄驗證。

  至此,簡單的服務器搭建已經完成了。然而,此時用戶的驗證是通過配置文件cas\WEB-INF\deployerConfigContext.xml中指定用戶名和密碼的方式進行驗證的。顯然這不滿足我們日常的需求,今天先介紹到這。下面再另行介紹通過mysql數據庫驗證的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM