天天看點

【單點登入筆記一】在eclipse+maven中搭建cas-server環境在eclipse+maven中搭建cas-server環境

在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和域名通路,發現已經可以展示登陸頁面了,效果是這樣的。

【單點登入筆記一】在eclipse+maven中搭建cas-server環境在eclipse+maven中搭建cas-server環境

預設使用者為casuser Mellon

2.3使用資料庫管理使用者

現在的使用者是在配置檔案中寫死的,在真正使用的時候肯定不能用配置檔案管理使用者,現在讓我們将其改成使用資料庫進行使用者驗證。

cas-server已經提供了一套元件實作了基本的資料庫使用者驗證,隻需要改些配置檔案即可。

到maven的本地庫路徑找到cas-server的war包,将war包web-inf目錄下的配置檔案複制一份到項目resources目錄下,隻需要拷貝需要修改的,需要拷貝的代碼如圖所示:

【單點登入筆記一】在eclipse+maven中搭建cas-server環境在eclipse+maven中搭建cas-server環境

注意這裡有個坑 這些配置檔案的根是web-info,而resources的預設部署檔案夾是web-inf/classes,是以需要修改一下部署配置:

【單點登入筆記一】在eclipse+maven中搭建cas-server環境在eclipse+maven中搭建cas-server環境

現在修改配置檔案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接口,再修改下配置檔案即可。

繼續閱讀