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>

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