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个会话专业管理员用户,但不应允许普通用户每个用户拥有多个会话.
默认策略仅允许全局设置最大会话,而不管用户如何.该属性设置在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)
| 归档时间: |
|
| 查看次数: |
1125 次 |
| 最近记录: |