cas支持单点登出了,那么它的基本机制是什么呢?
当用户经cas认证成功之后,就可以访问集成于cas的所有应用,而无需登录。那么认证是基于cookie的,因为cas在cookie是放了tgt,这样用户就可以无须二次登录,就可以访问另外的应用。但是cas为了安全,会给tgt设置一个过期的期限。当tgt过期之后,则cas会轮训这个tgt所访问的cas client端应用,并向每个cas client端应用发送登出请求。当终端应用能够解析cas服务器所发出的登出请求,则执行session销毁动作,实现了退出。这样一个用户所访问的所有终端都退出了,就实现了单点退出。
关于cas client端的单点退出,请参看:cas client入门之三:单点登出
对于cas服务端向cas client端所发出的登出请求应用的是saml协议,类似如下形式:
<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="[RANDOM ID]" Version="2.0" IssueInstant="[CURRENT DATE/TIME]"> <saml:NameID>@NOT_USED@</saml:NameID> <samlp:SessionIndex>[SESSION IDENTIFIER]</samlp:SessionIndex> </samlp:LogoutRequest>
cas服务端中cas.properties中的slo.callbacks.disabled 属性用来控制服务端单点登出的开关。它被cas\WEB-INF\spring-configuration\argumentExtractorsConfiguration.xml中
<bean id="casArgumentExtractor" class="org.jasig.cas.web.support.CasArgumentExtractor" p:httpClient-ref="noRedirectHttpClient" p:disableSingleSignOut="${slo.callbacks.disabled:false}" /> <bean id="samlArgumentExtractor" class="org.jasig.cas.web.support.SamlArgumentExtractor" p:httpClient-ref="noRedirectHttpClient" p:disableSingleSignOut="${slo.callbacks.disabled:false}" />
所应用。
在默认情况,cas服务器在tgt过期的时候,会自动的发起单点登出请求,你可以通过
<bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner" p:ticketRegistry-ref="ticketRegistry" p:lock-ref="cleanerLock" p:logUserOutOfServices="false" />
中的logUserOutOfServices这个属性来打开或关闭cas服务器自动发起的单点登出请求。你可能会发现,这个单点登出是由ticket的cleaner触发的。
如果所用的ticket存储机制不使用或者不需要ticket cleaner,那么怎么办呢?答案是要么放弃单点登出,要么你自己实现(可能这个有点难)。
发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)