Spring Security 自定义登录Session配置

本文介绍了如何在Spring Security中实现一个账号只能在一个客户端登录的功能。当同一账号尝试在另一客户端登录时,之前的登录会话会被强制结束。通过自定义过滤器接管登录过程后,需要手动配置session管理。主要步骤包括定义sessionRegistry、Session Strategy、CompositeSessionAuthenticationStrategy、ConcurrentSessionFilter,并在自定义过滤器中设置session策略,最后在HttpSecurity配置中进行相应设置。
摘要由CSDN通过智能技术生成
适用于session方式的登录,不适用于jwt token方式的登录。因为jwt token方式的话session就没什么事儿了 (此处为了防止小白不懂原理盲目抄)。

有这样一个需求,一个账号只能在一个客户端浏览器上登录,如果同样的账号在别的客户端浏览器上登录的话,之前的登录需要被踢下去。这个需求看似很简单,而且默认情况下使用Spring Security配置也挺简单,如下配置即可:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http

    ... //此处忽略若干行配置

    .sessionManagement()
            .maximumSessions(1);
}

这个配置在默认formLogin状态下生效,但如果使用自定义过滤器接管登录过程的话就会失效,如这样:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    ... //此处忽略若干行配置
    // 添加自己的登录过滤器
    .addFilterBefore(adminLoginFilter(), UsernamePasswordAuthenticationFilter.class)
    // 因为adminLoginFilter接管了默认formLogin的工作,所以下面的session配置失效了
    .sessionManagement()
            .maximumSessions(1);
}

这时我们需要手动配置session了,先看看官网是怎么说的 官网说明 这是官网的一段话

If you are using a customized authentication filter for form-based login, then you have to configure concurrent session control support explicitly.

官网也提供了具体配置方法

<http>
<custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
<custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" />

<session-management session-authentication-strategy-ref="sas"/>
</http>

<beans:bean id="redirectSessionInformationExpiredStrategy"
class="org.springframework.security.web.session.SimpleRedirectSessionInformationExp
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值