很早期的公司,一家公司可能只有一個應用,慢慢的應用開始變多,如員工報銷系統、審覈系統、學習系統......git
每一個應用都要進行註冊登陸,退出的時候又要一個個退出,用戶操做起來確實有點崩潰。github
咱們想要另外一種登陸體驗,公司裏面的應用只要一次註冊,登陸的時候只要一次登陸,退出的時候只要一次退出,這樣就完美了。web
CAS 算是最廣泛、最通用的單點解決方案,但若是自家公司大牛雲集,也不妨依據公司業務本身造輪子。spring
JA-SIG CAS(Central Authentication Service)爲 Web 應用系統提供了單點登陸服務。它的特性包括:數據庫
一個開放和具備很好文檔支持的協議;tomcat
一個Java開源服務器組件;安全
提供多種類型的客戶端包括 Java、.Net、PHP、Perl、Apache、uPortal等;服務器
可以與uPortal、BlueSocket、TikiWiki、 Mule、 Liferay、Moodle集成使用。cookie
從 github 下載源碼進行編譯打包便可獲得服務端 war,官網地址:https://www.apereo.org/projects/cassession
此篇博客算是 CAS 簡單入門,去掉了複雜的 HTTPS 協議、採用默認的 CAS 服務端檢驗方法和憑證,目的是新手能快速搭建單點環境。
在實際項目中使用時,確定會作不少個性化的定製,如單點登錄頁面、服務端用戶的校驗方式、會話中存儲的用戶對象結構等等。
因爲 CAS 默認是基於 HTTPS 協議,因此須要配置服務端的 tomcat,使之支持SSL安全協議訪問。
但對於初次體驗的人來講,仍是建議取消 CAS 默認的 HTTPS 協議,能節省不少的麻煩和配置過程。
須要進行修改的配置文件:
WEB-INF/deployerConfigContext.xml < bean class = "org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref = "httpClient" /> 增長參數 p:requireSecure="false",是否須要安全驗證即 HTTPS,false爲不採用 以下: < bean class = "org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref = "httpClient" p:requireSecure= "false" />
WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
修改 p:cookieSecure="true" 爲 p:cookieSecure="false",即不須要安全 cookie 以下: < bean id = "ticketGrantingTicketCookieGenerator" class = "org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure = "false" p:cookieMaxAge = "-1" p:cookieName = "CASTGC" p:cookiePath = "/cas" />
WEB-INF\spring-configuration\warnCookieGenerator.xml 修改 p:cookieSecure="true" 爲 p:cookieSecure="false",即不須要安全 cookie 以下: < bean id = "warnCookieGenerator" class = "org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure = "false" p:cookieMaxAge = "-1" p:cookieName = "CASPRIVACY" p:cookiePath = "/cas" />
從 github clone 下來的源碼進行編譯和打包,而後將對應的 war 包放入 tomcat webapp 下啓動 tomcat。
服務端默認採用的是靜態帳號和密碼的驗證方式,WEB-INF/deployerConfigContext.xml 以下。
<bean id="primaryAuthenticationHandler" class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
這裏固然能夠自定義校驗類(必改的地方),能夠經過數據庫帳號密碼、特殊的業務邏輯等等,只要符合 CAS 的返回值便可。
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
<constructor-arg>
<map>
<!-- | IMPORTANT | Every handler requires a unique name. | If more than one instance of the same handler class is configured, you must explicitly | set its name to something other than its default name (typically the simple class name). -->
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
服務端搭建起來後,其餘應用只須要簡單的幾部配置就能夠輕鬆經過 CAS 單點進行用戶的驗證。
依賴對應的客戶端 jar :
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>${cas.client.version}</version>
</dependency>
配置 web.xml 以下:
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<description>該過濾器用於實現單點登出功能,需放在全部單點過濾器前面</description>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<description>核心單點過濾器</description>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://127.0.0.1:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://127.0.0.1:8081/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<description>該過濾器負責對Ticket的校驗工做,必須啓用它</description>
<filter-name>CAS Validation Filter</filter-name>
<filter-class> org.jasig.cas.client.validation.Cas10TicketValidationFilter </filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://127.0.0.1:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://127.0.0.1:8081/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
到此,整個單點服務端和應用端的使用都已描述如上,已親測可用。