shiro集成CAS实现单点登出
来源:互联网 发布:网络图片头像 编辑:程序博客网 时间:2024/06/04 18:02
使用shiro集成CAS实现单点登录的文章有很多,配置大同小异。与之对应的单点登出可能大家关注的不够。
单点登出,表示浏览器同时访问了多个接入单点登录系统,在某个系统点击退出的同时,其他系统也应该同时登出。进一步提升了系统的安全性。
CAS,提供了很好的单点登出实现,用户只需要简单配置对应的监听器和过滤即可。原理也很简单,网上有很多说明。
<!-- 单点登出监听器 --> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <!-- 单点登出 --> <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>
线上会遇到一个问题:用户登录后权限信息发生变化。shiro默认会将用户权限信息、系统权限信息进行缓存,一定程度上提升系统的响应。使用默认单点退出,并不会将用户缓存信息进行情况。
基于这个问题,对SingleSignOutFilter进行一定改造:
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) servletRequest; if (handler.isTokenRequest(request)) { handler.recordSession(request); } else if (handler.isLogoutRequest(request)) { handler.destroySession(request); // Do not continue up filter chain return; } else { log.trace("Ignoring URI " + request.getRequestURI()); } filterChain.doFilter(servletRequest, servletResponse); }
解读源码,handler.destroySession(request),
public void destroySession(final HttpServletRequest request) { final String logoutMessage = CommonUtils.safeGetParameter(request, this.logoutParameterName); if (log.isTraceEnabled()) { log.trace ("Logout request:\n" + logoutMessage); } final String token = XmlUtils.getTextForElement(logoutMessage, "SessionIndex"); if (CommonUtils.isNotBlank(token)) { final HttpSession session = this.sessionMappingStorage.removeSessionByMappingId(token); if (session != null) { String sessionID = session.getId(); if (log.isDebugEnabled()) { log.debug ("Invalidating session [" + sessionID + "] for token [" + token + "]"); } try { session.invalidate(); } catch (final IllegalStateException e) { log.debug("Error invalidating session.", e); } } } }
代码会解析,获取当前登录用户的session,有了session,我们就可以得到shiro中的Subject对象了,就能调用subject.logout()方法,清除缓存了。当用户退出重新登录系统,新的权限信息立马生
if (handler.isTokenRequest(request)) { handler.recordSession(request); } else if (handler.isLogoutRequest(request)) { HttpSession session = handler.getSession(request); log.info("single sign out request,SesionID[" +session.getId()+"]"); if(session != null){ new WebSubject.Builder(getSecurityManager(), request, response).session(new HttpServletSession(session,"")).buildSubject().logout(); log.info("single sign out request,SesionID[" +session.getId()+"]"+",shiro subject logout success!"); } handler.destroySession(session); log.info("single sign out request,SesionID[" +session.getId()+"]"+",destroy session success!"); // Do not continue up filter chain return; } else { log.trace("Ignoring URI " + request.getRequestURI()); } filterChain.doFilter(servletRequest, servletResponse);
重写了SingleSignOutHandler类,首先获取session,然后通过new WebSubject。亲测有效。
0 0
- shiro集成CAS实现单点登出
- 集成CAS单点登录使用Shiro Session时,实现多点登出的解决办法
- 实现CAS单点登出
- 实现CAS单点登出
- 实现CAS单点登出
- shiro 集成cas单点登录
- 源代码解读Cas实现单点登出
- CAS单点登录登出的实现
- CAS单点登出
- cas 单点登出
- cas单点登出
- CAS(8)-单点登出
- CAS客户端单点登出
- CAS(8)-单点登出
- CAS单点登出:一
- CAS单点登出:二
- Shiro & CAS 实现单点登录
- Shiro & CAS 实现单点登录
- window python 操作mysql、redis
- 阿里云服务器centos6.5安装java运行环境
- Leetcode解题笔记(Linked List)
- 韩星点兵
- 史上最全IO集合框架九(数据流:数据字节流)
- shiro集成CAS实现单点登出
- faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说)
- 算法日记(Java实现)第20160718(4)期——POJ1007
- 《Linux学习》之shell
- 登录注册,三天免登陆
- 毕业生网站:管理员权限
- 你应该远离的6个Java特性
- NYOJ105九的余数
- Oracle SQL性能优化