Cas單點登錄原理


分爲三部分,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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章