在shiro-cas中实现 Jasig-cas的Single Sign Out 功能

1 Single Sign Out 功能

即单点登出功能。也就是在任意子系统进行登出操作后,其他子系统会自动登出。

实际CAS登出的步骤为

所以每个子系统都需要实现一个sso登出响应。

cas-client-core包中有Single Sign Out的Session容器实现。

具体在包 org.jasig.cas.client.session 中。

2 实现Shiro的SSO登出功能

1 实现CasSecurityManager

主要目的是为了在登陆成功后保存 ST票据,并与 Shiro的sessionId进行关系映射。

 1 /**
 2  * 安全管理中心。<br>
 3  * 主要目的是保存session和ticket之间的关系。
 4  * @author Weicl
 5  * @since 2016.4.25
 6  */
 7 public class CasSecurityManager extends DefaultWebSecurityManager{
 8
 9     Logger logger = LoggerFactory.getLogger(getClass());
10
11     @Override
12     protected void onSuccessfulLogin(AuthenticationToken token,
13             AuthenticationInfo info, Subject subject) {
14
15         if (token instanceof CasToken) {
16             logger.info("save token info: " + token.getCredentials() + " -> " + subject.getSession(false).getId());
17             SsoUtils.putTokenCache((String)token.getCredentials(), subject.getSession(false).getId());
18             subject.getSession(false).setAttribute("_serviceTicket_", token.getCredentials());
19         }
20
21         super.onSuccessfulLogin(token, info, subject);
22     }
23 }
PS: SsoUtils的putTokenCache。可以用ehcache或HashMap实现,其实没关系。

2 实现LogoutSloFilter

这个拦截器用来处理sso登出请求。

 1 /**
 2  * 单点登出处理
 3  * @author Weicl
 4  * @since 2016.4.25
 5  */
 6 public class LogoutSloFilter extends AdviceFilter{
 7     private final Logger logger = LoggerFactory.getLogger(getClass());
 8     private final Pattern pattern = Pattern.compile("<samlp:SessionIndex>([^<]*)</samlp:SessionIndex>");
 9
10     @Autowired
11     private NativeSessionManager nativeSessionManager;
12
13     @Override
14     protected boolean preHandle(ServletRequest request, ServletResponse response)
15             throws Exception {
16
17
18         try {
19             String logoutRequest = request.getParameter("logoutRequest");
20             String serviceTicket = extractServiceTicket(logoutRequest);
21
22             logger.info(" slo serviceTicket : " + serviceTicket);
23
24             String sessionId = (String)SsoUtils.getTokenCache(serviceTicket);
25             nativeSessionManager.stop(new DefaultSessionKey(sessionId));
26
27         } catch (Exception e) {
28             e.printStackTrace();
29         }
30
31         response.getWriter().write("OK");
32         return false;
33     }
34
35     /**
36      * 获取登出请求中的Ticket
37      * @param logoutRequest
38      * @return
39      */
40     private String extractServiceTicket(String logoutRequest) {
41         Matcher matcher = pattern.matcher(logoutRequest);
42         if (matcher.find()) {
43             return matcher.group(1);
44         }
45         return "";
46     }
47 }

3 实现TicketSessionListener

这个类的作用是当session终止的时候,释放 SsoUtil 中的tokenCache。因为应用的session不存在了,保存这个映射关系也没有意义,而且浪费缓存空间。

 1 /**
 2  * 票据及session监听器
 3  * @author Weicl
 4  * @since 2016.4.25
 5  */
 6 public class TicketSessionListener implements SessionListener{
 7
 8     Logger logger = LoggerFactory.getLogger(getClass());
 9
10     @Override
11     public void onStart(Session session) {
12
13     }
14
15     @Override
16     public void onStop(Session session) {
17         logger.info("===============================");
18         logger.info("stop session:" + session.getId());
19
20         String ticket = (String)session.getAttribute("_serviceTicket_");
21         if (ticket != null) {
22             logger.info("remove serviceTicket: " + ticket);
23             SsoUtils.removeTokenCache(ticket);
24         }
25     }
26
27     @Override
28     public void onExpiration(Session session) {
29         onStop(session);
30     }
31 }

4 配置到spring中

一下为添加/修正的关键代码。其他shiro的配置这边就不贴出来了。

 1     <!-- Shiro权限过滤过滤器定义 -->
 2     <bean name="shiroFilterChainDefinitions" class="java.lang.String">
 3         <constructor-arg>
 4             <value>
 5                 /static/** = anon
 6                 /cas = cas
 7                 /login = authc
 8                 /logout = logout
 9                 /logoutSlo = logoutSlo
10                 /** = user
11             </value>
12         </constructor-arg>
13     </bean>
14
15      <!-- 安全认证过滤器 -->
16     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
17         <property name="securityManager" ref="securityManager" />
18         <property name="loginUrl" value="${cas.server.url}/login?service=${cas.project.url}${adminPath}/cas" />
19         <!--
20         <property name="loginUrl" value="${adminPath}/login" /> -->
21         <property name="successUrl" value="${adminPath}/login" />
22         <property name="filters">
23             <map>
24                 <entry key="cas" value-ref="casFilter"/>
25                 <entry key="authc" value-ref="formAuthenticationFilter"/>
26                 <entry key="logout" value-ref="logoutFilter"></entry>
27                 <entry key="logoutSlo" value-ref="logoutSloFilter"></entry>
28             </map>
29         </property>
30         <property name="filterChainDefinitions">
31             <ref bean="shiroFilterChainDefinitions"/>
32         </property>
33     </bean>
34
35     <bean id="logoutSloFilter" class="cn.xxxxxx.base.modules.sys.security.LogoutSloFilter">
36     </bean>
37
38     <!-- 定义Shiro安全管理配置 -->
39     <bean id="securityManager" class="cn.xxxxxx.base.common.security.shiro.session.CasSecurityManager">
40         <!-- <property name="realm" ref="systemAuthorizingRealm" /> -->
41         <property name="realm" ref="systemCasRealm" />
42         <property name="sessionManager" ref="sessionManager" />
43         <property name="cacheManager" ref="shiroCacheManager" />
44     </bean>
时间: 2024-08-02 06:52:30

在shiro-cas中实现 Jasig-cas的Single Sign Out 功能的相关文章

源代码解读Cas实现单点登出(single sign out)功能实现原理

关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理出来后再了解了.当然去cas官方网站也是有很多的文章进行介绍.cas官网http://www.ja-sig.org/products/cas/. ok,现在开始本文的重点内容讲解,先来了解一下cas 实现single sign 的原理,如图所示: 登出原理图 从第一张图中,当一个web浏览器登录到应

CAS Server实现单点登录(Single Sign On , 简称 SSO )

一.什么是单点登录.二.利用耶鲁大学的开源项目CAS(Central Authentication Service),搭建基于JavaWeb项目的单点登录.三.针对具体项目对CAS做二次开发以适用具体的业务. 一.什么是单点登录.     单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.     当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系

源代码解读Cas实现单点登出(single sign out)功能实现原理--转

关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理出来后再了解了.当然去cas官方网站也是有很多的文章进行介绍.cas官网http://www.ja-sig.org/products/cas/. ok,现在开始本文的重点内容讲解,先来了解一下cas 实现single sign out的原理,如图所示: 图一                     

安装部署jasig cas server及相关实践

jasig cas server是一个开源的单点登录认证服务器.部署很简单,下载后将war包放入tomcat后启动.需要理解并解决的问题有: 一.使tomcat支持httpshttps协议通过ssl和数字证书来保证c/s间的数据传输安全.一般说来非对称加密算法性能要低于对称加密算法,所以ssl协议是用对称加密算法进行信息加密的.而在双方确立信任关系的时候需要用数字证书(非对称加密)来相互认证和商定密钥.那么要使tomcat支持https,部署密钥库/证书这一步是少不了的.证书可以花钱买,即全球可

CAS中配置Spnego协议支持

写在前面的话 公司原有的认证系统,是基于CAS4.1.8,并已经可以工作,此次的要求是实现支持Spnego,期间绕了很大的圈,主要原因还是对AD域的不熟悉. 在开发时要有三台机器,分别是Windows Server(提供DNS服务和AD域服务),Client(即客户机),Web Application Server(部署CAS应用的服务器,一般为linux系统,这里我以windows系统为例) 环境: windows server 2012 r2,JDK1.8,win7(client和web a

Configuring the JA-SIG CAS Client --官方

1. for Java using Spring Configuration of the CAS Client for Java via Spring IoC will depend heavily on their DelegatingFilterProxy class. For each filter that will be configured for CAS via Spring, a corresponding DelegatingFilterProxy is needed in

SSO(Single Sign On)系列(三)--CAS单点登录

上篇文章介绍了SSO的原理以及5种基本流程,相信看完了之后不难理解单点登录,而CAS是SSO的一种实现方案,原理是一样的.下面介绍一下. CAS Server:负责完成对用户的认证工作,需要独立部署,CAS Server会处理用户名/密码等凭证. CAS Client:负责处理对客户端受保护资源的访问请求,需要对请求方进行身份认证时,重定向到CAS Server进行认证.CASClient与受保护的客户端应用部署在一起,以Filter方式保护受保护资源. CAS请求认证图 说明:CAS Clie

如何利用tomcat和cas实现单点登录(2):配置cas数据库验证和cas客户端配置

接(1),上一篇主要讲述了tomcat和cas server端的部署. 接下来主要还有两个步骤. 注意:为了开启两个tomcat,要把直接配置的tomcat的环境变量取消!!!!!!!!!! 客户端配置mysql数据库登录 首先,在mysql中新建一个名字为test的数据库,新建表名user,添加两列:username和password. 插入一个数据:insert into user(username,password) values(’test’,’test’); Cas server 4.

(六)SSO之CAS框架扩展 改动CAS源代码实现与ESS动态password验证对接

题记: 偶尔的偶尔我们会听到这个站点的数据泄露了,那个站点的用户数据泄露了.让用户又一次改动登录password,所以,对于用户数据安全性越发的引起我们的重视了,尤其是一些保密性要求高的站点.更须要添加安全性了. 正文: 对于安全性问题.我们怎样解决呢? 解决方式: 1.避免sql注入问题. 2.用户登录password加密. 3.使用https安全訪问方式. 4.使用第三方设备.像银行一般使用的password口令. 5.... 前三种方案是比較常见的.这里主要说第四种解决方式,我们在前三种方