每个用户组或每个用户的Spring Security并发会话控制

Tit*_*ito 2 concurrency spring spring-security

我正在编写这个问题,以便了解如何控制用户可以引用的会话数Spring Security在春天,我可以定义所有用户必须拥有的最大会话数,即通过我定义的会话管理,例如不应允许所有用户拥有超过3个会话

.sessionManagement().maximumSessions(3)
Run Code Online (Sandbox Code Playgroud)

仅此一点是不够的,即我们需要为servlet容器提供一种通知spring安全性来更新会话或删除会话等的方法,因此我们需要配置HttpSessionEventPublishet

@Bean
public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
    return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是如何配置类似的东西:应允许管理员用户将最大会话数设置为8个会话专业管理员用户,但不应允许普通用户每个用户拥有多个会话.

M. *_*num 6

默认策略仅允许全局设置最大会话,而不管用户如何.该属性设置在ConcurrentSessionControlAuthenticationStrategy具有该属性的简单setter 的类上.

实际值在getMaximumSessionsForThisUser方法中确定,在默认实现中,该方法返回maximumSession属性的值.

您需要通过创建一个完全实现它的方法来实现自己的策略,或者SessionAuthenticationStrategy通过创建一个ConcurrentSessionControlAuthenticationStrategy简单地覆盖该getMaximumSessionsForThisUser方法的子类来更容易地实现它.

public class CustomConcurrentSessionControlAuthenticationStrategy extends ConcurrentSessionControlAuthenticationStrategy {

    protected int getMaximumSessionsForThisUser(Authentication authentication) {
        boolean admin = // Check authentication.getAuthorities() for the admin role
        return admin ? 8 : 1;

    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的配置中创建一个@Beanfor it并将该bean连接到sessionManagement配置部分.

@Bean
public CustomConcurrentSessionControlAuthenticationStrategy sessionControlStrategy() {
    return new CustomConcurrentSessionControlAuthenticationStrategy(new SessionRegistryImpl());
}
Run Code Online (Sandbox Code Playgroud)

然后在您的安全配置代码中执行类似的操作

sessionManagement().sessionAuthenticationStrategy(sessionControlStrategy());
Run Code Online (Sandbox Code Playgroud)