有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何知道用户在Spring security中的所有角色

我使用Spring安全性,所以请登录我正在创建的网站来学习Spring。我使用Hibernate将用户对象映射到允许用户根据其角色查看或不查看页面的其他对象。它起作用了

我在问我是否可以通过使用authorities by username query知道单个用户的所有角色,而不是检查我的用户对象。 这是我的疑问:

        authorities-by-username-query="select u1.utente, 
        u1.email, u2.descrizione, u3.id_autorizzazioni,
        u3.autorizzazione from autenticazione u1,
        autorizzazione u2, autorizzazioni
        u3 where u1.utente = u3.utente and 
        u2.id_autorizzazione = u3.autorizzazione and u1.email =?"

如果我在mysql控制台上写这个查询,我会得到3条记录,所以这个查询是正确的

这是我的数据库

enter image description here

我曾经 Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 但是我总是得到一个大小为1而不是3的集合(我在数据库中为用户设置了3个角色,如图中所示)。我不明白这是否取决于我的数据库或我的权限(通过用户名查询)。这两件事中可能有一件是错的


共 (2) 个答案

  1. # 1 楼答案

    您可以使用两种不同的方法:

    • 查询数据库中(任何用户的)用户角色
    • 在会话中“查看”以获取当前用户的角色

    对于第一种方法,可以调用UserDetailsService.loadUserByUsername(String username)方法

    对于第二种方法:SecurityContextHolder.getContext().getAuthentication().getAuthorities();

  2. # 2 楼答案

    您可以使用SecurityContextHolder.getContext().getAuthentication().getAuthorities()获取当前登录用户角色的集合

    Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>)    SecurityContextHolder.getContext().getAuthentication().getAuthorities();
    

    在authorities变量中有角色集合

    多运动一点

    private boolean hasRole(String role) {
      Collection<GrantedAuthority> authorities = (Collection<GrantedAuthority>)
      SecurityContextHolder.getContext().getAuthentication().getAuthorities();
      boolean hasRole = false;
      for (GrantedAuthority authority : authorities) {
         hasRole = authority.getAuthority().equals(role);
         if (hasRole) {
          break;
         }
      }
      return hasRole;
    }