公司有幾個(gè)系統(tǒng)想做SSO,然后開(kāi)始研究cas。系統(tǒng)是Centos7
搭建CAS服務(wù)器#
cas的版本比較多,先在網(wǎng)上搜了一下各種教程配置經(jīng)驗(yàn)。本來(lái)想搭建最新的CAS版本,然而為了快速部署,選擇了網(wǎng)上教程比較詳細(xì)的cas-4.0.0版本。
-
安裝包和環(huán)境依賴(lài)
cas-server是依賴(lài)jdk,tomcat,spring等,jdk和tomcat裝最新版本就可以了,cas-server這里選了4.0.0.因?yàn)榘姹静煌渲眠€有是區(qū)別的,所以這里強(qiáng)調(diào)一下版本。因?yàn)闆](méi)玩過(guò)JAVA,spring framework我沒(méi)裝,可能是tomcat自帶的。。新版本的cas-server好像是通過(guò)maven來(lái)裝,具體怎么裝我不知道。。但是有點(diǎn)想研究,看以后會(huì)不會(huì)填坑。
1.1 jdk
yum install 安裝貌似默認(rèn)是1.7,然后我選了1.8
1.2 tomcat
yum install 安裝最新版
1.3 spring framework
我沒(méi)裝。。然后沒(méi)啥影響。。
1.3 cas-server-4.0.0
在cas官網(wǎng)下載的,速度超級(jí)慢。不知道有沒(méi)有鏡像。下載完成然后解壓。進(jìn)入文件夾 找到cas-server-4.0.0/modules/cas-server-webapp-4.0.0.war
這個(gè) war 文件,拷貝到tomcat的webapps目錄下。默認(rèn)目錄在/usr/local/tomcat/webapps/
。以前沒(méi)玩過(guò)JAVA不知道,原來(lái)war
文件拷貝過(guò)來(lái)就會(huì)馬上自動(dòng)解壓成文件夾,然后war
移動(dòng)或刪除那個(gè)同名文件壓也會(huì)被刪!modules 目錄下的其他jar
是可能需要的依賴(lài)包,放到webapps下面自動(dòng)生成的文件夾里的WEB-INF/lib/
下,比如我這里叫cas-server-webapp-4.0.0/WEB-INF/lib/
。然后啟動(dòng)tomcat,在瀏覽器打開(kāi)。
tomcat的啟動(dòng)和關(guān)閉在tomcat目錄下的bin/
目錄的shutdown.sh
和startup.sh
:
tomcat重啟
(吐槽下tomcat的重啟慢到令人發(fā)指,推薦一個(gè)解決辦法) 導(dǎo)入證書(shū)OR去除https限制
2.1 生成ssl證書(shū)
cas默認(rèn)使用https,需要ssl證書(shū)。我跟著步驟生成了一個(gè)crt證書(shū),然后就不知道干嘛了。所以還是老老實(shí)實(shí)用http跑通再說(shuō)。
2.2 去除https限制
主要有3個(gè)地方需要修改:
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"`。 同上
- 驗(yàn)證方式
比較好奇應(yīng)該90%都會(huì)使用數(shù)據(jù)庫(kù)的用戶和密碼進(jìn)行認(rèn)證吧,為啥cas的默認(rèn)認(rèn)證方式不設(shè)置成數(shù)據(jù)庫(kù)方式呢。難道是為了給用戶自己選擇數(shù)據(jù)庫(kù)的自由?這里主要是3個(gè)XML屬性配置
3.0 依賴(lài)包
+.mysql-connector-java-5.1.42.jar
跟版本關(guān)系不大
+.c3p0-0.9.1.2.jar
這個(gè)很關(guān)鍵
+.cas-server-support-jdbc-4.0.0.jar
注意跟cas-server版本一致
3.1 數(shù)據(jù)源(數(shù)據(jù)庫(kù)配置)
<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}" />
網(wǎng)上配置教程大都是直接把配置寫(xiě)到這里,我這里建議用官方文檔的變量方式,一來(lái)避免`jdbcUrl`的特殊字符編碼問(wèn)題,而來(lái)方便修改配置。這些變量都可以在同目錄下的 `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" />
系統(tǒng)自帶MD5和SHA1加密算法,可以自定義,然而因?yàn)槲覜](méi)搞過(guò)JAVA所以就停留在這一步,沒(méi)有深入研究。
3.3 認(rèn)證方式
<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個(gè)配置項(xiàng)都是給這個(gè)做鋪墊。這個(gè)SQL語(yǔ)句根據(jù)自己的數(shù)據(jù)庫(kù)進(jìn)行查詢。網(wǎng)上教程有提到還有一個(gè)地方要修改
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<!-- <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
個(gè)人理解這里不一定要改成這樣,如果保留原來(lái)的`primaryAuthenticationHandler`那么需要把原來(lái)的`<bean id="primaryAuthenticationHandler"...`給注釋掉。而另指定一個(gè)認(rèn)證器`dbAuthHandler`就可以不用注釋掉原來(lái)的。到這里配置完成。
我在這里配置了無(wú)數(shù)遍,然后各種錯(cuò)誤。而且我又不知道怎么查看java/tomcat錯(cuò)誤,最后莫名其妙成功了。總結(jié)一下可能出錯(cuò)的地方:
dataSource 中的 class , 網(wǎng)上有的給出來(lái)的不一樣,建議以官網(wǎng)為主
jdbcUrl 可能有特殊字符編碼問(wèn)題,建議寫(xiě)到 cas.properties
依賴(lài)包不對(duì)
- 返回用戶信息
4.1 從數(shù)據(jù)庫(kù)查詢更多信息
<!-- 查詢更多用戶字段 -->
<bean class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao" id="attributeRepository">
<constructor-arg index="0" ref="dataSource"/>
<!-- 這里配置查詢語(yǔ)句, {0},{1}對(duì)應(yīng)接下來(lái)的`queryAttributeMapping`的map索引 -->
<constructor-arg index="1" value="select * from cas_user where {0}"/>
<property name="queryAttributeMapping">
<map>
<!--這里的key需寫(xiě)username和登錄頁(yè)面一致,value對(duì)應(yīng)數(shù)據(jù)庫(kù)用戶名字段-->
<entry key="username" value="username"/>
</map>
</property>
<property name="resultAttributeMapping">
<map>
<!--key為對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段名稱(chēng),value為提供給客戶端獲取的屬性名字,系統(tǒng)會(huì)自動(dòng)填充值-->
<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">
<!-- 這里是重點(diǎn) -->
<property name="allowedAttributes">
<list>
<value>uid</value>
<value>username</value>
<value>password</value>
<value>email</value>
<value>cname</value>
</list>
</property>
</bean>
...
到這里cas服務(wù)端的配置基本完成了。good luck。