基於CAS的單點登錄實戰(1)-- 搭建cas服務器


公司有幾個系統想做SSO,然后開始研究cas。系統是Centos7

搭建CAS服務器#

cas的版本比較多,先在網上搜了一下各種教程配置經驗。本來想搭建最新的CAS版本,然而為了快速部署,選擇了網上教程比較詳細的cas-4.0.0版本。

  1. 安裝包和環境依賴
    cas-server是依賴jdk,tomcat,spring等,jdk和tomcat裝最新版本就可以了,cas-server這里選了4.0.0.因為版本不同配置還有是區別的,所以這里強調一下版本。因為沒玩過JAVA,spring framework我沒裝,可能是tomcat自帶的。。新版本的cas-server好像是通過maven來裝,具體怎么裝我不知道。。但是有點想研究,看以后會不會填坑。
    1.1 jdk
    yum install 安裝貌似默認是1.7,然后我選了1.8
    1.2 tomcat
    yum install 安裝最新版
    1.3 spring framework
    我沒裝。。然后沒啥影響。。
    1.3 cas-server-4.0.0
    在cas官網下載的,速度超級慢。不知道有沒有鏡像。下載完成然后解壓。進入文件夾 找到cas-server-4.0.0/modules/cas-server-webapp-4.0.0.war這個 war 文件,拷貝到tomcat的webapps目錄下。默認目錄在/usr/local/tomcat/webapps/。以前沒玩過JAVA不知道,原來war文件拷貝過來就會馬上自動解壓成文件夾,然后war移動或刪除那個同名文件壓也會被刪!modules 目錄下的其他jar是可能需要的依賴包,放到webapps下面自動生成的文件夾里的WEB-INF/lib/下,比如我這里叫cas-server-webapp-4.0.0/WEB-INF/lib/。然后啟動tomcat,在瀏覽器打開。
    tomcat的啟動和關閉在tomcat目錄下的bin/目錄的shutdown.shstartup.sh:
    tomcat重啟
    (吐槽下tomcat的重啟慢到令人發指,推薦一個解決辦法

  2. 導入證書OR去除https限制
    2.1 生成ssl證書
    cas默認使用https,需要ssl證書。我跟着步驟生成了一個crt證書,然后就不知道干嘛了。所以還是老老實實用http跑通再說。
    2.2 去除https限制
    主要有3個地方需要修改:
    2.21 WEB-INF/deployerConfigContext.xml 找到 proxyAuthenticationHandle 添加屬性 p:requireSecure="false".

    <bean id="proxyAuthenticationHandler"
          class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
          p:httpClient-ref="httpClient"
          p:requireSecure="false" />
2.22 `WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml` 將 `p:cookieSecure="true"` 改為 `p:cookieSecure="false"`
    <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
          p:cookieSecure="false"
          p:cookieMaxAge="-1"
          p:cookieName="CASTGC"
          p:cookiePath="/cas" />
2.23 `WEB-INF/spring-configuration/warnCookieGenerator.xml` 將 `p:cookieSecure="true"` 改為 `p:cookieSecure="false"`。 同上
  1. 驗證方式
    比較好奇應該90%都會使用數據庫的用戶和密碼進行認證吧,為啥cas的默認認證方式不設置成數據庫方式呢。難道是為了給用戶自己選擇數據庫的自由?這里主要是3個XML屬性配置
    3.0 依賴包
    +. mysql-connector-java-5.1.42.jar 跟版本關系不大
    +. c3p0-0.9.1.2.jar 這個很關鍵
    +. cas-server-support-jdbc-4.0.0.jar 注意跟cas-server版本一致
    3.1 數據源(數據庫配置)
    <bean id="dataSource"
          class="com.mchange.v2.c3p0.ComboPooledDataSource"
          p:driverClass="${database.driverClass}"
          p:jdbcUrl="${database.url}"
          p:user="${database.user}"
          p:password="${database.password}" />
網上配置教程大都是直接把配置寫到這里,我這里建議用官方文檔的變量方式,一來避免`jdbcUrl`的特殊字符編碼問題,而來方便修改配置。這些變量都可以在同目錄下的 `cas.properties`中配置 
    # == Basic database connection pool configuration ==
    database.driverClass=com.mysql.jdbc.Driver
    database.url=jdbc:mysql://localhost:3306/cas_test?useUnicode=true&characterEncoding=UTF8
    database.user=root
    database.password=root

3.2 加密算法

    <bean id="passwordEncoder"
        class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
        c:encodingAlgorithm="SHA1"
        p:characterEncoding="UTF-8" />
系統自帶MD5和SHA1加密算法,可以自定義,然而因為我沒搞過JAVA所以就停留在這一步,沒有深入研究。

3.3 認證方式

    <bean id="dbAuthHandler"
        class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
        p:dataSource-ref="dataSource"
        p:passwordEncoder-ref="passwordEncoder"
        p:sql="SELECT `password` FROM `cas_user` WHERE `username`=?" />
可以看出上面2個配置項都是給這個做鋪墊。這個SQL語句根據自己的數據庫進行查詢。網上教程有提到還有一個地方要修改
        <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
        <!-- <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
        <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
個人理解這里不一定要改成這樣,如果保留原來的`primaryAuthenticationHandler`那么需要把原來的`<bean id="primaryAuthenticationHandler"...`給注釋掉。而另指定一個認證器`dbAuthHandler`就可以不用注釋掉原來的。到這里配置完成。

我在這里配置了無數遍,然后各種錯誤。而且我又不知道怎么查看java/tomcat錯誤,最后莫名其妙成功了。總結一下可能出錯的地方:
dataSource 中的 class , 網上有的給出來的不一樣,建議以官網為主
jdbcUrl 可能有特殊字符編碼問題,建議寫到 cas.properties
依賴包不對

  1. 返回用戶信息
    4.1 從數據庫查詢更多信息
    <!-- 查詢更多用戶字段 -->
    <bean  class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository">
        <constructor-arg index="0" ref="dataSource"/>
        <!-- 這里配置查詢語句, {0},{1}對應接下來的`queryAttributeMapping`的map索引 -->
        <constructor-arg index="1" value="select * from cas_user where {0}"/>
        <property name="queryAttributeMapping">
            <map>
                <!--這里的key需寫username和登錄頁面一致,value對應數據庫用戶名字段-->
                <entry key="username" value="username"/>
            </map>
        </property>
        <property name="resultAttributeMapping">
            <map>
                <!--key為對應的數據庫字段名稱,value為提供給客戶端獲取的屬性名字,系統會自動填充值-->
                <entry key="id" value="uid"/>
                <entry key="username" value="username"/>
                <entry key="password" value="password"/>
                <entry key="email" value="email"/>
                <entry key="cnName" value="cname"/>
            </map>
        </property>
        <!--    
        <property name="queryType">  
            <value>OR</value>  
        </property>   
        -->
    </bean>
4.2 配置返回字段
    <util:list id="registeredServicesList">
        <bean class="org.jasig.cas.services.RegexRegisteredService"
              p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
              p:serviceId="^(https?|imaps?)://.*" p:evaluationOrder="10000001">
        <!-- 這里是重點 -->
        <property name="allowedAttributes">
              <list>
                  <value>uid</value>
                  <value>username</value>
                  <value>password</value>
                  <value>email</value>
                  <value>cname</value>
              </list>
          </property>
        </bean>
    ...

到這里cas服務端的配置基本完成了。good luck。


免責聲明!

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



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