公司有幾個系統想做SSO,然后開始研究cas。系統是Centos7
搭建CAS服務器#
cas的版本比較多,先在網上搜了一下各種教程配置經驗。本來想搭建最新的CAS版本,然而為了快速部署,選擇了網上教程比較詳細的cas-4.0.0版本。
-
安裝包和環境依賴
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.sh
和startup.sh
:
(吐槽下tomcat的重啟慢到令人發指,推薦一個解決辦法) -
導入證書OR去除https限制
2.1 生成ssl證書
cas默認使用https,需要ssl證書。我跟着步驟生成了一個crt證書,然后就不知道干嘛了。所以還是老老實實用http跑通再說。
2.2 去除https限制
主要有3個地方需要修改:
2.21WEB-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"`。 同上
- 驗證方式
比較好奇應該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
依賴包不對
- 返回用戶信息
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。