CAS单点登录原理

 

 

术语介绍

1.SSO session:key="_const_cas_assertion_" value=assertion对象

    这个是CAS客户端拿着ticket去server认证后存储的用户信息,是客户端存储的SSO会话。只要拿不到这个session,就必须重定向去登录
2.ST(Service Ticket)ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
3.TGT(Ticket Grangting Ticket)TGT是CAS为用户签发的登录票据,拥有了TGT,用户就可以证明自己在CAS成功登录过。TGT封装了Cookie值以及此Cookie值对应的用户信息。用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。

 

CAS单点登录

 

第一次登录
1.用户带着JsessionId(第一次访问没有这个)去访问系统A,系统A在session中拿key="_const_cas_assertion_" value=assertion的SSOsession发现用户没有登录,重定向到sso认证中心(带着浏览器中的TGC,当然这次还没有登录肯定没有),并将自己的地址作为参数
2.sso server在查看请求中的TGC发现没有携带,说明用户没有登录,发送给用户登录页面
3.用户输入用户名密码,提交到sso
4.sso检查用户名密码,成功后创建TGC和ticket,并重定向到系统A,重定向地址含有ticket。(注意:重定向跳转之前向用户的浏览器设置了TGC这个cookie,以便以后使用)
5.系统A得到请求根据JssionId获取session,在session中拿key="_const_cas_assertion_" value=assertion的SSOsession。发现没有,所以没有登录,再去拿地址中的ticket,发现有ticket,便给sso server发送http请求来认证,请求的参数中有ticket和用户访问系统A的地址。

6.sso认证 系统A带来的ticekt和url参数 ,验证成功返回用户信息给系统A,系统A创建局部会话SSO session,返回资源,并给用户一个JsessionId作为cookie。用户下次访问系统A,拿着这个JsessionId获取session,再从session中获取SSO session,获取到就知道登录了。
CAS单点登录原理_第1张图片

第二次登录

 

1.用户带着JsessionId(第一次访问没有这个)去访问系统B,系统B在session中拿key="_const_cas_assertion_" value=assertion的SSOsession发现用户没有登录,重定向到sso认证中心,并将访问系统B的地址作为参数
2.sso得到TGC,并查询到了,说明用户登录了。
3.sso server将浏览器重定向到系统B(重定向地址中有sso server新生成的ticket),系统B去拿请求中的JsessionId,发现没有。再去拿地址中的ticket去sso认证
4.系统B得到请求根据JssionId获取session,在session中拿key="_const_cas_assertion_" value=assertion的SSOsession。发现没有,所以没有登录,再去拿地址中的ticket,发现有ticket,便给sso server发送http请求来认证,请求的参数中有ticket和用户访问系统B的地址。
5.sso认证系统B带来的ticekt和url参数 ,验证成功返回用户信息给系统B,系统A创建局部会话SSO session,返回资源,并给用户一个JsessionId作为cookie。用户下次访问系统B,拿着这个JsessionId获取session,再从session中获取SSO session,获取到就知道登录了。

其中涉及到两个Filter
org.jasig.cas.client.authentication.AuthenticationFilter

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

AuthenticationFilter:
作用是检查用户登录状态:     1.如果从session中获取assertion,说明登录;     2.如果获取到ticket则交给下面的Filter处理;     3.如果连session都没获取到则直接带着service url重定向到sso server

Cas20ProxyReceivingTicketValidationFilter:
作用是处理经过第1个Filter放行的请求:     1.即有含有ticket的请求。得到请求后就拿着service url和ticket去sso server认证,认证成功返    回用户信息然后生成assertion放入session,不成功则返回浏览器认证失败信息。
 

CAS单点登出

CAS单点登录原理_第2张图片

调用https://ssoserver:8443/logout,这个取得cookie里面的TGT数据,找到TGT中关联的所有ST对应的地址,向每个地址方式一个http请求,并传递logoutRequest参数。应用如果在参数中存在logoutRequest,则注销session(拿着sso server 给的ticket)

    
    org.jasig.cas.client.session.SingleSignOutHttpSessionListener    
 

org.jasig.cas.client.session.SingleSignOutFilter

这个注销的Fileter必须放在其他之前,因为得到ticket后就可以将session管理起来.SingleSignOutFilter,主要是在有ticket参数的时候,将session放到sessionMappingStorage(里面有一个map key="ticket" value=session对象),如果参数中存在logoutRequest,则注销session(拿着sso server 给的ticket)

你可能感兴趣的:(web开发碎知识)