我有一个使用spring安全性的spring-boot应用程序,我希望一些会话到期,以便用户需要重新登录。经过一番挖掘,我应该能够像
那样做List<Object> loggedUsers = sessionRegistry.getAllPrincipals();
for (Object principal : loggedUsers) {
if (principal instanceof User) {
final User loggedUser = (User) principal;
if (user.getUsername().equals(loggedUser.getUsername())) {
List<SessionInformation> sessionsInfo = sessionRegistry.getAllSessions(principal, false);
if (null != sessionsInfo && sessionsInfo.size() > 0) {
for (SessionInformation sessionInformation : sessionsInfo) {
sessionInformation.expireNow();
sessionRegistry.removeSessionInformation(sessionInformation.getSessionId());
}
}
}
}
}
我能在@Service类中做什么。我认为应该有一个SessionRegistry
bean由spring-boot或spring security创建。因此我添加
@Autowired
SessionRegistry sessionRegistry;
但这会抛出一个未找到bean的异常。
然后我尝试在我的spring安全配置类中创建一个SessionRegistry
bean。
@Bean SessionRegistry sessionRegistry()
{ return new SessionRegistryImpl(); }
我的服务中有这个bean,但getAllPrincipals()
返回空。
我认为这是因为这个bean与登录应用程序实际使用的bean实例不同。会话。
所以,我的问题是这个会话注册表对象是在哪里创建的,我该如何将它连接到我的服务中?
弹簧安全配置
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
JdbcUserDetailsManager detailManager;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.passwordEncoder(new BCryptPasswordEncoder())
.usersByUsernameQuery("select username,password, enabled from users where username=?")
.authoritiesByUsernameQuery("select username, role from user_roles where username=?");
detailManager = (JdbcUserDetailsManager) auth.getDefaultUserDetailsService();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests().antMatchers("/service", "/test", "/test2", ".resources/**", "/firmware/**", "/public/**", "/mycallback")
.permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();
}
@Bean
public JdbcUserDetailsManager userDetailsManager()
{
return detailManager;
}
}