记录用户春天

时间:2018-01-08 17:04:07

标签: java spring-boot spring-security session-management

我想通过利用spring SessionRegistry来检索当前登录的用户。

我已经定义了bean并将其应用于会话管理,如下所示:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http.sessionManagement().maximumSessions(1).sessionRegistry(sessionRegistry());
}

@Bean
public SessionRegistry sessionRegistry() {
   return new SessionRegistryImpl();
}

然后我创建了获取所有用户的方法:

@Autowired
private SessionRegistry sessionRegistry;

@Override
public List<String> getUsersFromSessionRegistry() {
 return sessionRegistry.getAllPrincipals().stream()
   .filter(u -> !sessionRegistry.getAllSessions(u, false).isEmpty())
   .map(Object::toString)
   .collect(Collectors.toList());
}

我在控制器中添加了一个方法,但它总是返回一个空列表

@GetMapping("/loggedUsersFromSessionRegistry")
public List<String> getLoggedUsersFromSessionRegistry() {
    return userService.getUsersFromSessionRegistry();
}

2 个答案:

答案 0 :(得分:0)

public List<String> getUsersFromSessionRegistry() {
    return sessionRegistry.getAllPrincipals()
        .stream()
        .filter((u) -> !sessionRegistry.getAllSessions(u, false)
            .isEmpty())
        .map(o -> {
            if (o instanceof User) {
                return ((User) o).getEmail();
            } else {
                return o.toString();
            }
        })
        .collect(Collectors.toList());

}

答案 1 :(得分:-1)

尝试使用SecurityContextHolder

类似的东西:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

if (principal instanceof UserDetails) {
  String username = ((UserDetails)principal).getUsername();
} else {
  String username = principal.toString();
}