我已从数据库中为当前用户加载了角色。我可以在jsp中使用spring security表达式访问用户角色,并且可以隐藏未经hasRole授权的选项和URL。现在我想将它放在servlet中并将其显示在日志中。(或存储在用户对象会话中)。我们怎样才能实现呢?
答案 0 :(得分:60)
您可以尝试这样的事情:
Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities();
您在权限变量中拥有角色集合。
更新:修复了GrantedAuthority泛型的错误
答案 1 :(得分:18)
如果您使用Java 8开发,它会变得更容易。
获取所有用户角色:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Set<String> roles = authentication.getAuthorities().stream()
.map(r -> r.getAuthority()).collect(Collectors.toSet());
检查用户是否具有特定角色,例如 ROLE_USER :
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
boolean hasUserRole = authentication.getAuthorities().stream()
.anyMatch(r -> r.getAuthority().equals("ROLE_USER"));
答案 2 :(得分:8)
您是否曾尝试从HttpServletRequest中调用getUserPrincipal()?
答案 3 :(得分:2)
完成两个答案......
以下是Spring
的{{1}}安全实施,因此您可以看到getUserPrincipal
实际上我们getUserPrincipal
SecurityContextHolder
答案 4 :(得分:1)
如果为我的项目创建了自定义hasRole
函数。
public static boolean hasRole (String roleName)
{
return SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
.anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals(roleName));
}
答案 5 :(得分:0)
def springSecurityService
def roles = springSecurityService.getAuthentication()。getAuthorities()