分爲三部分,1、Browser瀏覽器。2、Client Server客戶服務器(也稱之爲應用服務器application) 3、casServer cas服務器。
單點登陸:
Browser發起請求,訪問某一頁面,client檢測browser的cookie中的sessionID,如果已經存在,找到對應的session,通過session找到TGC票據,去cas驗證,成功,則允許訪問;不成功,則爲其新建一個session,client重定向到cas,重定向的過程中將client的url和新建的session的sessionID一起發送過去。cas要求brower登陸,驗證其輸入的用戶名和密碼(去數據庫中驗證)。如果驗證成功,則產生一個唯一的,不易被破解的TGC票據,將此票據發送給client,client再去cas驗證其票據的有效性,有效,則允許登陸。這樣,登陸一次的用戶,再去訪問其他持有票據的應用(統稱爲client)時,client都會根據訪者的sessionID獲得session,通過session獲得票據,再去cas驗證票據有效性,成功登陸……完成單點登陸。
Cas服務端的web.xml:
找到<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
我們可以將其註釋掉,換成我們希望的一個 AuthenticationHandler,比如,使用QueryDatabaseAuthenticationHandler 或 SearchModeSearchDatabaseAuthenticationHandler 可以分別選取
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="casDataSource" />
<property name="sql" value="select password from xt_yhxx where lower(YHMC) = lower(?)" />
<property name="passwordEncoder" ref="myPasswordEncoder"/>
</bean>
<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
</property>
<property name="username">
<value>stock</value>
</property>
<property name="password">
<value>111111</value>
</property>
</bean>
客戶端:
web.xml文件:
<filter>
<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>https://MICROSOF-3DBBD1:8443/cas-server-webapp/login</param-value>
</init-param>
<init-param>
<!-- the server name of the server this application is hosted on. -->
<param-name>serverName</param-name>
<param-value>http://MICROSOF-3DBBD1:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/rs/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/Home.html</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>
單點登出:
Browser 發起logOut請求到client,client重定向到casServier的/cas/logout,client重定向時將獲得的sessionID傳送到cas。cas根據收到的sessionId刪除對應的session,然後找到所有通過TGC票據登陸的client服務器,發送請求。client收到後請求後,會解析收到的請求,根據sessionID刪除對應的session。完成單點登出。
服務端:
cas單點退出直接鏈接到服務器的logout地址,爲了使退出後能返回原來的項目,需要做的修改。
1.服務端cas-servlet.xml配置
<bean id="logoutController" class="org.jasig.cas.web.LogoutController" ... .../>
增加屬性 p:followServiceRedirects="true"
2.退出的鏈接後加上?service=希望退出後返回的地址
例如 client1的退出 <a href="http://cas.google.com.cn/logout?service=http://client1.google.com.cn">退出</a>
client2的退出 <a href="http://cas.google.com.cn/logout?service=http://client2.google.com.cn">退出</a>
客戶端:
<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>
<listener>
<listener-class>
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
</listener-class>
</listener>