spring security 自定义退出策略
项目需要,要求登录用户非空闲状态,不可退出。说白了就是,在退出的时候增加逻辑判断,如果状态为非空,就不让其退出。
仔细查看spring security文档,发现这个框架里维护了一个过滤器链,来提供服务。而我退出策略用的是LogoutFilter,框架默认提供的过滤器。代码如下:
<sec:http use-expressions="false" auto-config="true"entry-point-ref="loginUrlAuthenticationEntryPoint"><sec:intercept-url pattern='/**' access='ROLE_LOGIN' />**<sec:logout invalidate-session="true" logout-url="/logout" success-handler-ref="logoutSuccessHandler"delete-cookies="JSESSIONID"/>**<sec:csrf disabled="true" /><sec:custom-filter position="CONCURRENT_SESSION_FILTER"ref="concurrencyFilter" /><sec:custom-filter before="FORM_LOGIN_FILTER" ref="authFilter" /><sec:session-management invalid-session-url="/sessionexpired"session-authentication-strategy-ref="sas" /></sec:http>
而框架提供过滤器链如下:
因此可以自定义过滤器,赶在LogoutFilter之前执行,配置如下:
<sec:custom-filter before="LOGOUT_FILTER"ref="cloudqLogoutFilter" /><bean id="cloudqLogoutFilter" class="com.raymon.cloudq.security.CloudqLogoutFilter"><property name="logoutUrl" value="/logout" /></bean>
filter代码如下
/*** 非空闲状态下,用户不能退出* Created by on 2017/11/7.*/
public class CloudqLogoutFilter extends GenericFilterBean {private org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());private ObjectMapper mapper = new ObjectMapper();private String logoutUrl;@AutowiredWindowCurrentStateMapper windowCurrentStateMapper@Overrideprotected void initFilterBean() throws ServletException {super.initFilterBean();mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.UpperCamelCaseStrategy());}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;if (this.requiresLogout(request, response) && SecurityContextHolder.getContext() != null&& SecurityContextHolder.getContext().getAuthentication() != null) {AuthUserDetails authUser = (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();ClientEmp clientEmp = authUser.getClientEmpUser();Integer empId = clientEmp.getEmpId();Integer branchesId = clientEmp.getBranchesId();List<WindowsParticulars> windowEmpList = windowCurrentStateMapper.selectbyEmpId(branchesId, empId);if (windowEmpList != null && windowEmpList.size() > 0) {for (WindowsParticulars windowEmp : windowEmpList) {if (Constants.WINDOW_CURRENT_STATE_CALL.equals(windowEmp.getCurrentState()) || Constants.WINDOW_CURRENT_STATE_IN_PROCESS.equals(windowEmp.getCurrentState())) {logger.info("您的账号id='{}',name='{}',非空闲状态下,用户不能退出", clientEmp.getEmpId(), clientEmp.getEmpName());printErrorMsg(servletResponse);return;}}}}filterChain.doFilter(servletRequest, servletResponse);}private void printErrorMsg(ServletResponse servletResponse) {servletResponse.setContentType("application/json");servletResponse.setCharacterEncoding("UTF-8");PrintWriter out = null;try {out = servletResponse.getWriter();Result result = new Result(StatusCode.ERROR_WINDOW_NOT_HANDLE, null, "非空闲状态下,用户不能退出");out.write(mapper.writeValueAsString(result));} catch (IOException e) {e.printStackTrace();} finally {if (out != null) {out.close();}}}/*** 判断请求路径是否是退出** @param request* @param response* @return*/private boolean requiresLogout(HttpServletRequest request, HttpServletResponse response) {if (StringUtils.isBlank(logoutUrl))return false;String path = request.getRequestURI();return path.contains(logoutUrl);}public void setLogoutUrl(String logoutUrl) {this.logoutUrl = logoutUrl;}
}
问题搞定!
spring security 自定义退出策略相关推荐
- Spring Security 自定义接口登出
Spring Security 自定义接口登出 使用Security提供的工具,在接口内登出用户. 工具类代码 // 注入 tokenStore@Autowiredprivate final Toke ...
- Spring Security自定义登录验证及登录返回结果
Spring Security自定义登录验证及登录返回结果 一.功能描述 二.处理逻辑 简单流程 自定义UserDetails 自定义UserDetailsDAO 自定义UserDetailsServ ...
- (二)Spring Security自定义登录成功或失败处理器
目录 一:创建登录成功处理器 二:创建登录失败处理器 三:添加处理器 三. 项目地址 我们接着上一章 Spring Security最简单的搭建,进行开发 LoginSuccessHandler 和L ...
- 3.Spring Security 自定义用户认证
Spring Security自定义用户认证 自定义认证过程 自定义认证的过程需要实现Spring Security提供的UserDetailService接口,该接口只有一个抽象方法loadUser ...
- spring security 自定义认证登录
spring security 自定义认证登录 1.概要 1.1.简介 spring security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,以此来管理权限认证等. 1 ...
- spring security自定义指南
序 本文主要研究一下几种自定义spring security的方式 主要方式 自定义UserDetailsService 自定义passwordEncoder 自定义filter 自定义Authent ...
- Spring Security——自定义认证错误提示信息及自适应返回格式解决方案
解决方案 package com.hailiu.web.handler;import com.hailiu.model.Log; import com.hailiu.web.bean.Response ...
- Spring Security 自定义资源服务器实践
相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Secur ...
- Spring Security 强制退出指定用户
应用场景 最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑! 社区的安全框架使用了 spring-security 和 spring-session,登录状态 ...
最新文章
- C语言程序设计 搜集C/C++编译器
- 毕业设计:基于Springboot实现求职招聘,校园招聘系统
- NetworkOnMainThreadException异常
- 如何查看笔记本电脑配置参数_2020双十一(小白/学生)如何选购笔记本电脑?5000元预算哪款笔记本配置值得入手?...
- Java 集合中的方法性能分析
- 对话推荐系统_RSPapers | 对话推荐系统论文合集
- BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
- 如何写一手好 SQL 【频繁出现慢SQL告警的优化方案】
- C++11 并发指南四(future 详解二 std::packaged_task 介绍)
- GIT创建公钥,并放置远程库
- python 基础课程第二天
- Solidity的三种合约间的调用方式 call、delegatecall 和 callcode
- 安装版mysql数据库data在_MySQL 5.7版本的安装使用详细教程+更改数据库data的存储路径...
- 【机器学习算法笔记】5. 自组织映射SOM
- 论文研究结论怎么写?
- 虚拟机服务器安装虚拟机的步骤
- SLCP验厂辅导,工厂进行社会劳工整合项目(SLCP认证)验证的具体步骤是
- 讲明白——K8S各核心架构组件
- 百度推广创意怎么写?百度推广创意十大秘籍
- LINK : fatal error LNK1181: cannot open input file “libcurl.lib“