如何知道用户在Spring安全性中的所有角色

时间:2015-01-19 09:44:28

标签: java spring hibernate spring-security

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

我问我是否可以通过使用 authority-by-username-query 来了解单个用户拥有的所有角色,而不是检查我的User对象。 这是我的问题:

        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个角色,如图所示)。我不明白它是否取决于我的数据库或 authority-by-username-query 。可能两件事之一是错误的

2 个答案:

答案 0 :(得分:1)

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

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

您在权限变量中拥有角色集合。

稍微练习一点

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;
}

答案 1 :(得分:-1)

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

  • 查询(数据库中)任何用户的用户角色
  • &#34;外观&#34;在Session中获取当前用户的角色

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

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