我在spring boot应用程序中使用spring security来提供用户功能。我花了一些时间寻找问题的答案,但只为使用基于xml的配置的人找到了解决方案。
我的设置非常相似:http://www.baeldung.com/spring-security-track-logged-in-users(底部的替代方法)。
这是我的SecurityConfiguration:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().defaultSuccessUrl("/home.html", true)
//.and().exceptionHandling().accessDeniedPage("/home")
.and().authorizeRequests().antMatchers("/editor").hasAnyAuthority("SUPERUSER")
.and().authorizeRequests().antMatchers("/editor").hasAnyAuthority("ADMIN")
.and().authorizeRequests().antMatchers("/").permitAll().anyRequest().authenticated()
.and().formLogin().loginPage("/login").permitAll()
.and().authorizeRequests().antMatchers("/static/**").permitAll()
.and().logout().permitAll().logoutSuccessUrl("/login").logoutUrl("/logout").deleteCookies("JSESSIONID")
.and().csrf().disable();
http.sessionManagement().invalidSessionUrl("/login").maximumSessions(1).sessionRegistry(sessionRegistry()).expiredUrl("/login");
}
这是我调用sessionRegistry的地方:
public List<String> getAllLoggedUsernames() {
final List<Object> allPrincipals = sessionRegistry.getAllPrincipals();
// System.out.println("All Principals: " + sessionRegistry.getAllPrincipals());
List<String> allUsernames = new ArrayList<String>();
System.out.println(allUsernames.size());
for (final Object principal : allPrincipals) {
if (principal instanceof SecUserDetails) {
final SecUserDetails user = (SecUserDetails) principal;
//Make sure the session is not expired --------------------------------------------------▼
List<SessionInformation> activeUserSessions = sessionRegistry.getAllSessions(principal, false);
if (!activeUserSessions.isEmpty()) {
allUsernames.add(user.getUsername());
System.out.println(user.getUsername());
}
}
}
return allUsernames;
}
现在,当我尝试获取当前登录的用户时,我会正确地得到它:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
我的sessionRegistry以下列方式定义为Bean:
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
我只能通过类似这样的服务从控制器调用 getAllLoggedUsernames():
@Autowired
private SecUserDetailService service;
后来在@RequestMapping函数中:
service.getAllLoggedUsernames();
无论有多少用户实际登录,收到的列表总是空的。
现在我从这里问到的其他问题的猜测是,某种程度上我的应用程序被加载两次或者我的bean设置搞砸了。我认为@Autowired不起作用,因为我认为服务需要某种上下文信息?
我对依赖注入很新,所以很难让一切都正确。
提前感谢您的帮助!
编辑 - 次要说明
答案 0 :(得分:0)
解决:有一个类型错误,getAllLoggedUsers()
方法中的if语句总是被解析为false,因为Object不是我自己的UserDetails类的实例,而是org.springframework.security.core.userdetails 。用户!