我使用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条记录,所以查询是正确的。
这是我的数据库
我用过
Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities();
但我总是得到一个大小为1而不是3的集合(我在数据库中为用户提供了3个角色,如图所示)。我不明白它是否取决于我的数据库或 authority-by-username-query 。可能两件事之一是错误的
答案 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)
您可以使用两种不同的方法:
对于第一种方法,可以调用UserDetailsService.loadUserByUsername(String username)
方法。
对于第二种方法:SecurityContextHolder.getContext().getAuthentication().getAuthorities();