【问题标题】:How to know all roles a user has in Spring security如何知道用户在 Spring 安全中的所有角色
【发布时间】:2015-03-17 06:50:01
【问题描述】:

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

我问我是否可以通过使用 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 条记录,所以查询是正确的。

这是我的数据库

我用过 Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 但我总是得到一个大小为 1 而不是 3 的集合(我在用户的数据库中有 3 个角色,如图所示)。我不明白它是取决于我的数据库还是我的 authorities-by-username-query。可能这两件事之一是错误的

【问题讨论】:

  • 你有什么问题?
  • 如何知道一个用户的所有角色
  • 你在 1-size Collection 中扮演什么角色?
  • 谢谢大家。问题是authorities-by-username-query 查询。作为查询的第二个字段,我应该检索角色。到目前为止,我只得到了一个元素,因为根据我写的错误查询,我正在记录用户的电子邮件。

标签: java spring hibernate spring-security


【解决方案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 而不是 3 的集合(我在数据库中有 3 个角色供用户使用)。我不明白它是否取决于我的数据库或我的查询。可能这两件事之一是错误的
  • 谢谢大家。问题是authorities-by-username-query 查询。作为查询的第二个字段,我应该检索角色。到目前为止,我只得到了一个元素,因为根据我写的错误查询,我正在记录用户的电子邮件。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我不想进行另一个查询,我想知道是否可以使用“authorities-by-username-query”。 “看会议”是什么意思?我可以知道用户名,但找不到知道角色列表的方法
  • UserDetailsService.loadUserByUsername 重用查询!
  • 谢谢大家。问题是authorities-by-username-query 查询。作为查询的第二个字段,我应该检索角色。到目前为止,我只得到了一个元素,因为根据我写的错误查询,我正在记录用户的电子邮件。
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 2012-10-26
  • 2021-04-14
  • 2013-12-15
  • 2014-07-01
  • 1970-01-01
  • 2018-06-24
  • 2015-09-04
相关资源
最近更新 更多