根据像this one这样的文章,可以完全使用Spring而无需修改任何xml文件。所以没有修改任何XML文件,我正在尝试使用SessionRegistry
访问所有当前登录的用户,就像它已完成here一样。到目前为止我所尝试的是,首先,创建一个像这样的Bean:
@Configuration
public class SomeClass {
[...]
@Bean
SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
[...]
}
然后在我的控制器中注入Bean:
@Controller
public class SomeController {
@Resource(name = "sessionRegistry")
private SessionRegistryImpl sessionRegistry;
@RequestMapping(value = { "/"})
public String list() {
List<Object> principals = sessionRegistry.getAllPrincipals();
}
[...]
}
但是每当我打印出principals
时,我就会得到一个空列表。所以我的假设是,可能只是按照我的方式创建Bean是不够的。但为什么?你对如何继续有任何建议吗?
答案 0 :(得分:0)
首先,您需要确保在Spring Security配置中使用会话存储库。我猜你当前正在使用一个不同的SessionRepository实例。例如:
protected void configure(
HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.sessionManagement()
.maximumSessions(1)
// This line is important otherwise a default instance
// will be used that is different than your Bean
.sessionRegistry(sessionRegistry())
.expiredUrl("/login?expired");
}
@Bean
SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
接下来,您需要确保指定了HttpSessionEventPublisher。这可以使用以下方法完成:
public class SecurityInitializer extends
AbstractSecurityWebApplicationInitializer {
@Override
protected boolean enableHttpSessionEventPublisher() {
return true;
}
}
另请注意,您需要将@Resource
类型更改为SessionRegistry
而不是SessionRegistryImpl
。例如:
@Resource(name = "sessionRegistry")
private SessionRegistry sessionRegistry;