在eclipse+maven中搭建cas-server環境
單點登入系統的使用還是很廣泛的,在之前在微信公衆号的開發中就有使用過,但是那時使用的用戶端,對服務端的部署,二次開發沒有實踐。在這裡記錄下搭建過程。
ps:環境是cas-server-4.2.7
1.單點登入的一般流程
我接觸過的單點登入(sso)的流程基本都一緻,這裡不拘泥于cas,大緻記錄一下單點登入的登入流程:
1. 使用者通路接入sso的應用中需要授權的url位址;
2. 應用攔截到這個請求,發現沒有登入,通知客戶浏覽器重定向到sso位址,同時将原始通路位址當參數用于回調(ps:網際網路公司提供的sso可能會要求同意的回調位址,在這種情況下一般會提供一個stge參數,可以用來儲存目前狀态)。
3. sso收到請求(注意是由客戶浏覽器發起的),先檢查該使用者是否已經登陸了sso:已登陸的,直接生成票據回調;未登陸的展示登陸頁。
4. 使用者登陸成功後在cookies中寫入登陸資訊,通知客戶浏覽器重定向到應用伺服器的回調位址,附加票據參數。
5. 應用系統收到回調的請求(分統一回調位址和直接原始位址,原始位址的需要增加攔截器實作登陸流程),應用系統通路sso的登陸驗證接口,驗證票據的有效性,并擷取使用者資訊,并與本應用的使用者做關聯。
6. 應用伺服器傳回原始通路位址的内容,對于統一回調位址的,通過stge差數,擷取緩存的實際位址,通知客戶浏覽器重定向,否則自己攔截器放行即可。
2.cas-server的搭建過程
2.1.建立項目
建立一個基于maven的web項目,不在詳細介紹,主要我們來看pom.xml
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-webapp</artifactId>
<version>4.2.7</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
加入這一句,這樣這個項目就可以執行了,但是cas是限定https通路的,我們需要為tomcat伺服器配置設定證書:
1. 首先擷取到一個ssl證書,不管是自己生成,還是從機構申請。
2. 在eclipse的servers項目中找到對應tomcat的配置檔案,在server.xml中将這段代碼的注釋去掉,并配置上證書的路徑及密碼,以支援https通路
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" keystoreFile="conf/cas.fyuhome.com.jks" keystorePass="yu137267">
</Connector>
好了,現在可以啟動項目,通過https和域名通路,發現已經可以展示登陸頁面了,效果是這樣的。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcVTT6pVdsd0Y1Z0VlFDbzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYvwFd4VGdvwlMvw1ayFWbyVGdhd3P5QzM1ITN1ETOxQDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
預設使用者為casuser Mellon
2.3使用資料庫管理使用者
現在的使用者是在配置檔案中寫死的,在真正使用的時候肯定不能用配置檔案管理使用者,現在讓我們将其改成使用資料庫進行使用者驗證。
cas-server已經提供了一套元件實作了基本的資料庫使用者驗證,隻需要改些配置檔案即可。
到maven的本地庫路徑找到cas-server的war包,将war包web-inf目錄下的配置檔案複制一份到項目resources目錄下,隻需要拷貝需要修改的,需要拷貝的代碼如圖所示:
注意這裡有個坑 這些配置檔案的根是web-info,而resources的預設部署檔案夾是web-inf/classes,是以需要修改一下部署配置:
現在修改配置檔案deployerConfigContext.xml,增加如下配置,用于注冊jdbc處理元件:
<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
<bean id="queryDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="passwordEncoder" ref="MD5PasswordEncoder"/>
</bean>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="org.postgresql.Driver"
p:jdbcUrl="jdbc:postgresql://127.0.0.1:5432/cas"
p:user="cas"
p:password="123456"
p:initialPoolSize="6"
p:minPoolSize="6"
p:maxPoolSize="18"
p:maxIdleTimeExcessConnections="120"
p:checkoutTimeout="10000"
p:acquireIncrement="6"
p:acquireRetryAttempts="5"
p:acquireRetryDelay="2000"
p:idleConnectionTestPeriod="30"
p:preferredTestQuery="select 1"/>
資料庫配置根據自己的資料庫進行修改,這裡使用的是postgresql,密碼加密規則是md5。
修改deployerConfigContext.xml,将
<alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" />
修改為
<alias name="queryDatabaseAuthenticationHandler" alias="primaryAuthenticationHandler" />
使之前新加的配置生效
另外修改一下cas.properties,增加查詢使用的sql
cas.jdbc.authn.query.sql=select passwd from "sampleUser" where "userName"=?
現在登陸資料庫,建立相應的表,確定sql可以正常執行,在表中行政一個使用者,注意密碼需要md5加密後的。
現在,重新開機項目,應該已經可以使用資料庫中的賬号進行登陸。
這裡插入一句,cas高版本用戶端也需要支援https,如果需要支援http需要修改HTTPSandIMAPS-10000001.json
改為
"serviceId" : "^(https|imaps|http)://.*",
3.自定義實作使用者驗證
要自定義驗證使用者名密碼,隻需要參考org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler 實作AbstractUsernamePasswordAuthenticationHandler接口,再修改下配置檔案即可。