适用于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