Spring Security - UserRole 或 UserAuthentication

Posted

技术标签:

【中文标题】Spring Security - UserRole 或 UserAuthentication【英文标题】:Spring Security - UserRole or UserAuthentication 【发布时间】:2015-12-30 18:18:58 【问题描述】:

我正在尝试学习 Spring 安全性。

通过一些教程后,我发现其中一些使用 UserRole(s),而另一些使用实现身份验证的 UserAuthentication 类。 我尝试实现(并且有效)的一个是创建一个自定义 MyUserDetailsS​​ervice 来实现 UserDetailsS​​ervice,并像这样授予权限(角色?):

private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) 
        Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

        // Build user's authorities
        for (UserRole userRole : userRoles) 
            setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
        

        List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);

        return Result;
    

我想知道用户角色和 GrantedAuthorities 之间有什么区别(例如,在使用 @PreAuthorize(hasRole...) 与 @PreAuthorize(hasAuthority...) 时),如果他们做同样的事情,为什么两者都存在?或使用一个与另一个相比的优势。

【问题讨论】:

角色是权限的“子类型”。如果使用基于角色的访问控制,请使用角色。您还可以授予“can_edit”之类的权限 所以角色类似于具有以前缀“ROLE_”开头的“命名约定”的权限,对吗?基于此,如果我使用“can_edit”之类的权限,我应该使用@PreAuthorize("hasAuthority('can_edit')")? 【参考方案1】:

关于您的评论 “有些使用 UserRole,有些使用 UserAuthentication”,这实际上是两个不同的概念——UserRole 用于用户授权,另一个用于用户身份验证。为什么使用一个而不是另一个只是实施解决方案以验证和授权用户的各种情况的问题。身份验证用于确定她是否是她所说的用户,而授权是用于确定她是否可以实际执行请求。关于您的教程,我可能还有点距离,因为我还没有看过它,但我希望能帮助您理解其中提到的两个不同概念,以及为什么它们是对概念的补充而不是竞争。

关于您实施的方向,我认为您的自定义详细信息服务走在正确的轨道上,我过去已经做过无数次了,而且效果很好。关于您关于用户角色和GrantedAuthority 的问题——我认为将GrantedAuthority 视为一种抽象是安全的,它允许您提供自定义字符串标记以识别/分类某些用户/系统/等。在一组。哪个基本上是 UserRole 太对了?我不是 Spring 安全贡献者,但我的猜测是 GrantedAuthority 的创建只是为了在其安全域上下文中抽象角色的概念。

通过将您的角色字符串放入GrantedAuthority,您是说经过身份验证的用户具有以下权限——角色,您可以说。 @PreAuthorize 采用 EL 字符串,如果用户被“授予”,则该字符串可以匹配经过身份验证的用户的授予权限集合中的字符串之一。如果用户没有被授予权限/角色,那么她就没有能力执行请求。对于您所问的,概念是相同的。

来自 Spring 文档:

 @PreAuthorize("hasRole('ROLE_USER')")
  public void create(Contact contact);

此外,此页面很有帮助(请参阅:15.3 方法安全表达式): Spring Expressions

我希望这会有所帮助。

【讨论】:

以上是关于Spring Security - UserRole 或 UserAuthentication的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:2.4 Getting Spring Security

没有 JSP 的 Spring Security /j_spring_security_check

Spring-Security

Spring Security 登录错误:HTTP 状态 404 - /j_spring_security_check

未调用 Spring Security j_spring_security_check

Spring Security入门(3-7)Spring Security处理页面的ajax请求