Spring boot sessionRegistry 返回空的主体列表

克劳迪奥·布鲁

我在 Spring Boot 应用程序中使用 spring security 来提供用户功能。我花了一些时间寻找问题的答案,但只为使用基于 xml 的配置的人找到了解决方案。

我的设置与此非常相似:http : //www.baeldung.com/spring-security-track-logged-in-users(底部的替代方法)。

这是我的安全配置:

@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 不起作用,因为我认为服务需要某种上下文信息?

不过,我对依赖注入真的很陌生,所以很难让一切都正确。

提前感谢您的任何帮助!

编辑 - 小说明

克劳迪奥·布鲁

已解决:出现类型错误,方法中的 if 语句getAllLoggedUsers()总是解析为 false,因为 Object 不是我自己的 UserDetails 类的实例,而是 org.springframework.security.core.userdetails.User 的实例!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring sessionRegistry提供零登录用户的列表

来自分类Dev

Spring Boot中的查询返回空值

来自分类Dev

在存储库中返回空点异常 - Spring Boot

来自分类Dev

带参数的Spring JdbcTemplate返回空列表

来自分类Dev

Spring安全性:Spring Security如何在SessionRegistry中注册新会话?

来自分类Dev

经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

来自分类Dev

经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

来自分类Dev

spring boot rest JPA查询在通过电子邮件查询时返回空对象

来自分类Dev

拆分器返回空数组列表Spring Integration

来自分类Dev

从Spring Boot Controller返回JAXB生成的元素

来自分类Dev

Spring Boot JSON返回无限的嵌套对象

来自分类Dev

Spring Boot @ResponseStatus不返回HTTP消息

来自分类Dev

如何从Spring Boot @Controller返回json / xml?

来自分类Dev

Spring Boot Response实体不返回JSON

来自分类Dev

Spring Boot - Rest Pagination 返回消息 HttpMessageNotWritableException

来自分类Dev

如何在 Spring Boot 上返回 JSONObject?

来自分类Dev

从Spring Boot配置中获取列表

来自分类Dev

AngularJS + Spring Boot安全性以编程方式更改主体

来自分类Dev

Spring Boot资源服务器主体名称

来自分类常见问题

Spring MVC或Spring Boot

来自分类Dev

Spring Boot Controller Test-Mockito when then返回列表不起作用

来自分类Dev

从 Spring Boot 控制器返回非 JSON 数据(对象列表)

来自分类常见问题

Spring MVC与Spring Boot与Spring

来自分类Dev

即使保存子代,Spring Data Jpa Test也会返回空列表

来自分类Dev

在Spring Boot中将YAML列表映射到对象列表

来自分类Dev

Spring Boot + Spring Data JPA + Spring Data ElasticSearch:elastic 不返回任何结果

来自分类常见问题

Spring Boot Docker容器返回文件而不是JSP视图

来自分类Dev

Spring Boot-登录后返回用户对象

来自分类Dev

Spring-boot从控制器返回json和xml

Related 相关文章

  1. 1

    Spring sessionRegistry提供零登录用户的列表

  2. 2

    Spring Boot中的查询返回空值

  3. 3

    在存储库中返回空点异常 - Spring Boot

  4. 4

    带参数的Spring JdbcTemplate返回空列表

  5. 5

    Spring安全性:Spring Security如何在SessionRegistry中注册新会话?

  6. 6

    经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

  7. 7

    经过SAML身份验证的用户不会出现在Spring Security的SessionRegistry中

  8. 8

    spring boot rest JPA查询在通过电子邮件查询时返回空对象

  9. 9

    拆分器返回空数组列表Spring Integration

  10. 10

    从Spring Boot Controller返回JAXB生成的元素

  11. 11

    Spring Boot JSON返回无限的嵌套对象

  12. 12

    Spring Boot @ResponseStatus不返回HTTP消息

  13. 13

    如何从Spring Boot @Controller返回json / xml?

  14. 14

    Spring Boot Response实体不返回JSON

  15. 15

    Spring Boot - Rest Pagination 返回消息 HttpMessageNotWritableException

  16. 16

    如何在 Spring Boot 上返回 JSONObject?

  17. 17

    从Spring Boot配置中获取列表

  18. 18

    AngularJS + Spring Boot安全性以编程方式更改主体

  19. 19

    Spring Boot资源服务器主体名称

  20. 20

    Spring MVC或Spring Boot

  21. 21

    Spring Boot Controller Test-Mockito when then返回列表不起作用

  22. 22

    从 Spring Boot 控制器返回非 JSON 数据(对象列表)

  23. 23

    Spring MVC与Spring Boot与Spring

  24. 24

    即使保存子代,Spring Data Jpa Test也会返回空列表

  25. 25

    在Spring Boot中将YAML列表映射到对象列表

  26. 26

    Spring Boot + Spring Data JPA + Spring Data ElasticSearch:elastic 不返回任何结果

  27. 27

    Spring Boot Docker容器返回文件而不是JSP视图

  28. 28

    Spring Boot-登录后返回用户对象

  29. 29

    Spring-boot从控制器返回json和xml

热门标签

归档