天天看點

JFinal整合CAS實作SSO單點登陸(服務端)

  • 生成server key及證書

生成server key

指令行運作如下指令

keytool -genkey -alias key_name -keyalg RSA -keypass 123456 -storepass 123456  -dname "CN=www.mycas.com,OU=csoa,O=csoa,L=FZ,ST=FZ,C=CN" -ext san=ip:192.168.2.121   -validity 3600  -keystore changename.keystore
           

指令解釋:(以上所有指令和參數之間都有空格,每個指令之間也有空格)

-genkey 為生成key的指令

-alias key_name 為指定key的别名,在導入導出證書時會用到

-keyalg RSA 為指定key的加密算法,為預設算法

-keypass 123456 為指定證書密碼,即後續在tomcat中配置的密碼

-storepass 123456 為指定密鑰庫的密碼,即jre/lib/security/cacerts密鑰庫的密碼,在導入導出證書時需要用到

密鑰庫和證書的差別就像是tomcat容器和裡面裝載的application的差別,也就是你登陸了tomcat你就可以對所有的application進行管理(例如deploy,delete),但是你要使用application就必須有application本身對應的密碼

-dname "CN=www.mycas.com,OU=csoa,O=csoa,L=FZ,ST=FZ,C=CN" 為指定下面截圖内容

JFinal整合CAS實作SSO單點登陸(服務端)

其中最重要的是“名字與姓氏”,隻能使用域名(未測試使用IP時的所有情況,但大部分情況都無法成功),其它的随便填即可

-ext san=ip:192.168.2.121 為指定上述域名所使用的主題備用名稱(Subject Alternative Name, SAN),可指定為IP,這樣就能使用IP來通路CAS服務端和用戶端

-validity 3600 指定密鑰預設的有效期,機關是天

-keystore changename.keystore 指定生成檔案的檔案名

導出證書

keytool -export -trustcacerts -alias tomcat_key -file client.cer -keystore server.keystore -storepass changeit
           

這裡用到的tomcat_key、server.keystore、changeit、client.cer分别對應上述描述中的key别名、server key檔案名、密鑰庫密碼、導出的證書檔案名

生成的證書,必須在每個用戶端的伺服器使用的JRE中導入,這樣才能夠保證雙方完成協定握手,否則會抛出異常

  • 部署CAS預設項目

​​​​​​部署項目

将cas-server-webapp-4.2.5.war複制到服務端tomcat下,并修改名稱為cas.war(友善浏覽器通路)

注:伺服器tomcat也和用戶端tomcat一樣,需要修改tomcat配置檔案,詳情見用戶端手冊第二大點

通路CAS首頁及登陸

啟動tomcat,待正常啟動後(無報錯),通路https://localhost:8443/cas

如果出現證書非法等字樣,點進階選項繼續通路即可

例如火狐會出現如下提示

JFinal整合CAS實作SSO單點登陸(服務端)

點進階,接受風險并繼續即可

JFinal整合CAS實作SSO單點登陸(服務端)

這樣就進入了CAS的首頁

JFinal整合CAS實作SSO單點登陸(服務端)

當然也可以通路http頁面,http://localhost:8087/cas/,這樣就不會出現證書不被信任的情況,但是首頁會有不安全連接配接提示

JFinal整合CAS實作SSO單點登陸(服務端)

我們輸入使用者名casuser密碼Mellon即可登陸成功

JFinal整合CAS實作SSO單點登陸(服務端)
  • 修改CAS登陸配置-使用資料庫表登陸

修改CAS配置檔案

關掉tomcat,删除cas.war(必須先關掉tomcat再删除否則項目檔案夾也會自動删除),然後進入項目檔案夾cas/WEB-INF/目錄,找到deployerConfigContext.xml檔案

詳情可見對應的配置檔案,可以直接用它覆寫源檔案,下面是對添加的配置的說明

在<util:map id=”authenticationHandlersResolvers”>中添加一行

<entry key-ref="databaseAuthenticationHandler" value-ref="primaryPrincipalResolver" />
           
JFinal整合CAS實作SSO單點登陸(服務端)

其中第二條entry是預設的登陸方式(casuser/Mellon),如果不想使用者以這種方式登陸,則可以去掉第二條entry,第三條entry是我們自己定義的校驗方式,其中key-ref是我們自己定義的bean or alias,名字可以随便起,而value-ref是預設的校驗Resolver,不需要改

在<alias name="personDirectoryPrincipalResolver" alias="primaryPrincipalResolver" />下面添加如下内容

     <bean name="queryDatabaseAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

         <property name="dataSource" ref="dataSource"></property>

         <property name="sql" value="select password from t_sys_user where username = ?"></property>

         <property name="passwordEncoder" ref="defaultPasswordEncoder"></property>

     </bean>
           

這個是我們自己定義的登陸驗證bean,指定的class是CAS提供的一個預設實作,用來實作使用者名密碼的校驗過程,源碼檔案可以自行檢視源碼目錄中的檔案,其中的sql可以自行根據需要修改,如果要修改sql的傳回值,那麼必須得修改QueryDatabaseAuthenticationHandler檔案中的邏輯代碼,同樣的,其屬性passwordEncoder也是CAS提供的一個預設實作,用來實作對密碼加密的過程(資料庫存密文),如果需要對明文進行比對,那麼可以選擇修改密碼校驗的QueryDatabaseAuthenticationHandler或者DefaultPasswordEncoder

       <alias name="queryDatabaseAuthenticationHandler" alias="databaseAuthenticationHandler" />

     <alias name="dataSource" alias="queryDatabaseDataSource" />
           

這個是定義的别名,就是一個引用的關系

     <bean id="dataSource"

           class="com.mchange.v2.c3p0.ComboPooledDataSource"

           p:driverClass="${cas.audit.database.driverClass}"

           p:jdbcUrl="${cas.audit.database.url}"

           p:user="${cas.audit.database.user}"

           p:password="${cas.audit.database.password}"

           p:initialPoolSize="${cas.audit.database.pool.minSize}"

           p:minPoolSize="${cas.audit.database.pool.minSize}"

           p:maxPoolSize="${cas.audit.database.pool.maxSize}"

           p:maxIdleTimeExcessConnections="${cas.audit.database.pool.maxIdleTime}"

           p:checkoutTimeout="${cas.audit.database.pool.maxWait}"

           p:acquireIncrement="${cas.audit.database.pool.acquireIncrement}"

           p:acquireRetryAttempts="${cas.audit.database.pool.acquireRetryAttempts}"

           p:acquireRetryDelay="${cas.audit.database.pool.acquireRetryDelay}"

           p:idleConnectionTestPeriod="${cas.audit.database.pool.idleConnectionTestPeriod}"

           p:preferredTestQuery="${cas.audit.database.pool.connectionHealthQuery}" />
           

這是自定義資料源bean,和spring裡面自定義資料源是一模一樣的,${}是表示引用的變量,變量儲存在cas.properties檔案中

JFinal整合CAS實作SSO單點登陸(服務端)

同樣登陸驗證bean中的sql也可以使用變量的方式配置在此配置檔案中

修改配置支援http協定

找到classes/services/目錄下的HTTPSandIMAPS-10000001.json檔案,用編輯器打開後,修改第二行 

"serviceId" : "^(https|imaps|http)://.*",
           

即可讓CAS支援用戶端認證登陸時的http協定及請求,當然如果還有FTP請求也可以在這裡添加,隻是一般無需通過FTP請求認證登陸

修改登陸驗證代碼

建立web項目,将CAS/WEB-INF/lib目錄下所有jar包導入,将源碼中的QueryDatabaseAuthenticationHandler.java拷貝到項目檔案夾下,注意要帶全路徑,建議直接拷貝該檔案所在的父級檔案夾java下的所有檔案

JFinal整合CAS實作SSO單點登陸(服務端)

例如這裡是定位到java目錄,然後把整個org檔案夾複制到src目錄下,形成如下目錄結構

JFinal整合CAS實作SSO單點登陸(服務端)

必須這樣設定目錄結構,一是確定檔案導入進來的時候不會報錯(package路徑問題),二是修改完畢後需要覆寫原jar包中的class檔案,是以必須能夠正常編譯,如果有錯誤是無法正常編譯的

打開該檔案,将第47行注釋,寫入我們自己的代碼

JFinal整合CAS實作SSO單點登陸(服務端)
JFinal整合CAS實作SSO單點登陸(服務端)

這裡是因為我們的密碼存的明文,是以直接拿頁面參數(credential)中的password和資料庫中密碼比對即可,無需進行加密操作,全部修改完畢後,重新開機服務端tomcat即可

繼續閱讀