cas 單點登入(一)
對接單點登入不是這個端退出不了,就是使用者賬號實現多模組切換,甚是煩惱
1、cas服務端:下載地址:http://downloads.jasig.org/cas/,cas的服務端和客戶端有許多版本,最新版本和老版本
有很大的區別,目前服務端最新版本為:cas-server-3.4.4-release.zip
解壓cas-server-3.4.4-release.zip將modules目錄下的cas-server-webapp-3.4.4.war改名稱為cas.war複製到
tomcat的webapps下,啟動tomcat,訪問:http://localhost:8080/cas/login
cas服務端預設採用的是 使用者名稱=密碼的驗證,並且採用的是https驗證,需要給tomcat配置證書,本系統沒有采用https驗證,若採用https驗證可參考:
http://blog.csdn.net/haydenwang8287/archive/2010/07/26/5765941.aspx。
1.1、若不採用https驗證,伺服器端需要配置
1、cas\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"/>
2、cas\WEB-INF\spring-configuration\
ticketGrantingTicketCookieGenerator.xml
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
引數p:cookieSecure="true",同理為HTTPS驗證相關,TRUE為採用HTTPS驗證,FALSE為不採用https驗證。
引數p:cookieMaxAge="-1",簡單說是COOKIE的最大生命週期,-1為無生命週期,即只在當前開啟的IE視窗有效,IE關閉或重新開啟其它視窗,仍會要求驗證。可以根據需要修改為大於0的數字,比如3600等,意思是在3600秒內,開啟任意IE視窗,都不需要驗證。
1.2、伺服器端退出訪問:http://localhost:8080/cas/logout,
若希望退出後能返回則需要配置
服務端cas-servlet.xml配置
<bean id="logoutController" class="org.jasig.cas.web.LogoutController" ... .../>
增加屬性 p:followServiceRedirects="true"
退出連結為:http://localhost:8080/cas/logout?service=http://localhost:8080/Casclient/index.jsp
1.3、更改伺服器端驗證方式,採用資料庫驗證:
修改配置檔案deployerConfigContext.xml,加dbcp連線池:(以oracle為例)
<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@192.168.18.26:1521:orcl</value>
</property>
<property name="username">
<value>test</value>
</property>
<property name="password">
<value>test</value>
</property>
</bean>
需要的jar包有:(見附件:cas-server-support-jdbc-3.4.4.jar,commons-dbcp-1.2.1.jar,commons-pool-1.3.jar,ojdbc14_g.jar)
配置加密方式,cas內建的有MD5加密,也可以寫自己的加密類,實現org.jasig.cas.authentication.handler.PasswordEncoder介面即可:
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
<constructor-arg value="MD5"/>
</bean>
註釋掉預設的驗證方式,採用資料庫查詢驗證:
<property name="authenticationHandlers">
<list>
<!----註釋掉這裡的預設驗證方式,採用以下驗證QueryDatabaseAuthenticationHandler-->
<!--
<bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> -->
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="casDataSource" />
<property name="sql"
value="select password from userinfo where lower(username) = lower(?)" />
<property name="passwordEncoder" ref="passwordEncoder"/>
</bean>
</list>
</property>
---------------到這裡cas服務端的配置就完成了。
2、java客戶端配置,下載客戶端:http://downloads.jasig.org/cas-clients/,目前最新版本為:cas-client-3.2.0
將modules下的jar複製到java客戶端Casclient1的lib下,在web.xml中配置過濾器,配置如下(詳情見附件):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 用於單點退出,該過濾器用於實現單點登出功能,通知其他應用單點登出-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 該過濾器用於實現單點登出功能,可選配置。 -->
<filter>
<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>
<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://192.168.18.8:8080/cas/login</param-value>
<!--這裡的server是服務端的IP-->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://192.168.18.8:8989</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://192.168.18.8:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://192.168.18.8:8989</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
該過濾器負責實現HttpServletRequest請求的包裹,
比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名,可選配置。
-->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
頁面為:
<%
AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
String username = principal.getName();
%>
<br/>----------------------------------------------------------<br/>
<h1>登入成功,這是客戶端1啊</h1><br/>
使用者名稱:<%=username %><br/>
<a href="http://localhost:8989/Casclient2/index.jsp">進入客戶端2</a><br/>
<a href="http://localhost:8080/cas/logout?service=http://localhost:8989/Casclient1/index.jsp">退出</a><br/>
-----------到這裡java客戶端配置成功,釋出到tomcat,複製Casclient1改名為Casclient2,啟動tomcat,
訪問Casclient1,跳轉到登入頁面,登入成功後成功轉向登入成功頁面,這時訪問Casclient2發現不需要登入即顯示登入成功頁面,java單點登入成功。
參考網址:
http://blog.csdn.net/DL88250/archive/2008/08/20/2799522.aspx
http://www.wsria.com/archives/1349
http://tonrenyuye.blog.163.com/blog/static/30012576200922925820471/