1.什麼是單點登入
特别注意
本文講的是CAS單點登入CAS4.0.0版本,CAS預設認證方式使用的事HTTPS協定,一般對安全性不高的話建議取消改成HTTP方式,因為開啟的話會經常提示證書過去,需要使用者确認等,對客戶感覺不好。目前有需要可以開啟。
單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,使用者隻需要登入一次就可以通路所有互相信任的應用系統。
舉例:上豆瓣,要登入豆瓣FM、豆瓣讀書、豆瓣電影、豆瓣日記,如果我們通路豆瓣讀書、豆瓣電影、豆瓣日記都需要進行一次登入認證,那麼使用者體驗是非常不好的。是以引用了單點登入。隻要一次登入就可以通路所有互相信任的應用系統。
單點登入機制:
上圖實作用Cookie進行驗證登入
2.實作方法
2.1 CAS服務端
準備工作tomcat一個更改端口号
解壓下載下傳的cas-server4.0.0服務端壓縮包,找到cas-server-4.0.0\modules\cas-server-webapp-4.0.0.war檔案解壓到tomcat中的webapps下然後可以配置取消HTTPS協定換成HTTP協定
(1)打開cas-server\WEB_INF\deployerConfigContext.xml檔案,找到id是proxyAuthenticationHandler配置
在後面添加配置
将HTTPS協定換成HTTP協定。當然你不換也行,不過就需要證書了。
(2)打開cas-server\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml檔案
找到id是ticketGrantingTicketCookieGenerator進行配置
将true改成flase,即不開啟HTTPS驗證
(3)打開cas-server\WEB-INF\spring-configuration\warnCookieGenerator.xml檔案,找到id是warnCookieGenerator
将true改為flase,即不開啟HTTPS驗證。
服務端這就配置好了。
(4)啟動tomcat運作CAS,通路localhost:8080/cas-server
運作成功。下面該登入了。
4.0以上版本的登入使用者名密碼在deployerConfigContext.xml配置檔案中可以看到
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
使用者名casuser密碼Mellon
4.0以下版本使用者名跟密碼保持一緻就可以登入成功,如圖
服務端就算搭建成功了。
2.2在服務端配置資料庫使用者名密碼,跟資料庫連接配接登入
服務端配置成功,當然我們的單點登入要跟資料庫項目來關聯的。服務端隻配置跟資料庫連接配接就行了
(1)修改deployerConfigContext.xml配置檔案
将這塊注釋掉
新增bean資料庫連接配接
新增bean編寫登入sql語句
另外需要将c3p0-0.9.1.2.jar包、mysql-connector-java-5.1.21.jar包和cas-server-support-jdbc-4.0.0.jar這三個jar導入到lib下。
在修改id為authenticationManager的bean
紅框内注釋掉
再次運作Tomcat,通路https://localhost:8443/cas/login就能進行資料庫驗證了。
用戶端配置
将下面這一段配置到你的項目中的web.xml檔案中就可以了
<!--用于單點退出,該過濾器用于實作單點登出功能,可選配置 -->
<context-param>
<param-name>casServerLogoutUrl</param-name>
<param-value>http://localhost:8083/cas-server-webapp-4.0.0/logout</param-value>
</context-param>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!--該過濾器用于實作單點登出功能,可選配置。 -->
<filter>
<filter-name>CASSingle Sign OutFilter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASSingle Sign OutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://localhost:8083/cas-server-webapp-4.0.0/login</param-value> <!--服務端的位址-->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value> <!--用戶端的位址-->
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--該過濾器負責對Ticket的校驗工作,必須啟用它 -->
<filter>
<filter-name>CASValidationFilter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:8083/cas-server-webapp-4.0.0</param-value><!--服務端的位址-->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value> <!--用戶端的位址-->
</init-param>
</filter>
<filter-mapping>
<filter-name>CASValidationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過濾器負責實作HttpServletRequest請求的包裹, 比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名,可選配置。 -->
<filter>
<filter-name>CASHttpServletRequest WrapperFilter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CASHttpServletRequest WrapperFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來擷取使用者的登入名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CASAssertion Thread LocalFilter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CASAssertion Thread LocalFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ========================單點登入結束 ======================== -->