CAS SSO 工作机制(每一步请求详述)

下面分析下CAS SSO(以3.4.5为例)的基本工作原理。先假定一个应用场景,如图,有两个Web应用分别是webapp1、webapp2(Spring Security 3应用) 。一个认证服务器CAS(假设部署在http://domain-cas/cas-server)。我们看三个典型阶段:

 

 

一、未登录用户访问webapp1应用

1. 用户发起起始请求到某一应用。如网址 http://domain-webapp1/page1

2. 作为CAS Client的webapp1应用,CAS_FILTER过滤器将截获请求,检查是否已登录。如已登录,直接返回请求响应。如没有,返回302浏览器redirect转向CAS认证服务器,并带上自己应用作为cas client已经配好的service地址。如

http://domain-cas/cas-server/?service=http://domain-webapp1/j_spring_cas_security_check

 

对SS3的应用webapp1来说,service地址的配置要点如下:

 

[html] view plaincopy
  1. <beans:bean id="casService" class="org.springframework.security.cas.ServiceProperties">   
  2.     <beans:property name="service" value="<span style="font-size:12px;"><span>http://domain-webapp1/j_spring_cas_security_check</span></span>"/>   
  3. </beans:bean>   

 

3. CAS首先查看用户请求是否携带CASTGC名称的Cookie(CASTGC这个名称在CAS中的ticketGrantingTicketCookieGenerator.xml中可配置)。如没有或已过期认证未通过,输出CAS登录页面

 

4. 用户输入认证信息提交,如认证通过,CAS设置CASTGC Cookie。(类似CASTGC=TGT-2-IsNtxgv3h9dVi44B3zprQm5AGFbKB3ZBMGjtVumgC5E10VqbHF-cas; path=/cas; domain=localhost)  同时redirect到webapp1应用的service地址,并附上CAS为此service设置的ticket。如


http://domain-webapp1/j_spring_cas_security_check?ticket=ST-2-JWzXJKrXXGy7vAm6rEhA-cas 


5. webapp1和CAS进行交互,验证ticket有效后,再次redirect用户浏览器到用户起始请求地址:http://domain-webapp1/page1

redirect到cas进行校验的url配置要点如下:
 
[html] view plaincopy
  1.     <beans:bean id="casTicketValidator" class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">   
  2.         <beans:constructor-arg value="http://domain-cas/cas-server/"/>   
  3. </beans:bean>   

这个校验接口,在CAS中的cas.properties文件中定义
 
 
[html] view plaincopy
  1. cas.securityContext.ticketValidator.casServerUrlPrefix=http://domain-cas/cas-server/  

 




6. 此时webapp1应用已经有了验证通过的用户信息,redirect返回正常页面内容。


二、已登录用户首次访问webapp2应用


7. 用户发起起始请求,到某一应用。网址 http://domain-webapp2/page2

8. webapp2应用按常规(如根据session)检查是否已经登录。 如没有,则redirect用户浏览器转向CAS认证服务器,并带上自己的spring cas client已经配好的service地址。如

http://domain-cas/cas-server/?service=http://domain-webapp2/j_spring_cas_security_check

9. CAS首先查看用户浏览器是否携带CASTGC Cookie,此时webapp1已为浏览器设置,如CASTGC有效验证通过,则redirect到webapp2应用的service地址,并附上CAS为此service设置的ticket。

10. webapp2和CAS进行交互,验证ticket有效后,再次redirect用户浏览器到用户起始请求地址:http://domain-webapp2/page2

11. 此时webapp2应用已经有了验证通过的用户信息,返回正常页面内容。


三、Logout情况
 
假设用户在webapp1和webapp2中都访问过,此时从webapp1中登出。spring cas client所做的工作是:
1. webapp1首先清除自己应用的session用户登录信息。
2. 然后访问CAS的 /logout接口,清除CAS中的登录信息。同时CAS向所有service发出注销请求(CAS Server端,参见org.jasig.cas.web.LogoutController,其调用org.jasig.cas.CentralAuthenticationServiceImpl 的destroyTicketGrantingTicket方法,最后调用org.jasig.cas.authentication.principal.AbstractWebApplicationService的logOutOfService方法。CAS Client端,参见cas-client-core jar包中的org.jasig.cas.client.session.SingleSignOutFilter这个过滤器在SS 配置文件中配置),删除CAS Client中的session,清除登录信息,因此webapp2中的登录信息也将清除。
3. 此时用户如再次访问webapp2时,将转向CAS登录页面。



原文转自:http://blog.csdn.net/roadmap001/article/details/8223511#comments
展开阅读全文

没有更多推荐了,返回首页