springsecurity 实现强制用户下线-前后端分离

本文讲述了在不使用Redis缓存情况下,如何在前后端分离的Vue应用中,利用SpringSecurity实现强制用户下线功能。作者通过自定义HttpSession监听器和过滤器,监听session事件,实现在管理员变更用户权限时即时强制用户下线。
摘要由CSDN通过智能技术生成

前言

最近相对较忙,没有更新博客,正值假期,赶紧抽空写两篇。也是遇到的项目上的需求:管理员变更了用户的权限,但是用户如果系统在线的话,有些权限功能仍旧可以使用。对此,强制用户下线的需求来了。括弧:由于系统预期为一对一的单服务系统,没有使用redis做缓存。所以对强制用户下线的功能带来了一些麻烦。

设计思路

  • 对于系统的用户信息,既然没用redis做缓存,我想到了对session下手,用session存储用户信息。
  • 了解springsecurity对session的操作

查找资料

  • 网上的解决办法
    在这里插入图片描述
  • 我发现这个bean类并不能取到session,打印的session永远是一个空的数组。
  • 于是,通过查阅资料,springsecurity通过对用户的认证之后会销毁
    session的信息。也就是说,想要取到SecurityContextHolder,必须是在过滤器链上的操作。想要单独使用,没有办法取到用户的信息。

自己手写缓存过滤器

HttpSession监听器

需要在安全配置类中注入该bean类
在这里插入图片描述

  • 注入该bean类

在这里插入图片描述

  • 这个时候,我们就可以随时监听session的创建,移除,和销毁的事件了,如下:
@WebListener
@Component
@Slf4j
public class SessionListener implements HttpSessionAttributeListener {
   
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
   
        log.info("--attributeAdded--");
        log.info("key----:"+httpSessionBindingEvent.getName());
        log.info("value---:"+httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
   
        log.info("--attributeRemoved--");
        log.info("key----:"+httpSessionBindingEvent.getName());
        log.info("value---:"+httpSessionBindingEvent.getValue());
    }

    @Override
    pu
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值