当前位置: 首页 > 知识库问答 >
问题:

Spring Security性-用户角色或用户身份验证

车靖琪
2023-03-14

我在学Spring保安。

在浏览了一些教程之后,我发现其中一些使用了UserRole,而一些使用了一个实现身份验证的UserAuthentication类。我尝试实现的一个(并起作用)是创建一个自定义的MyUserDetailsService,它实现UserDetailsService,并授予权限(角色?)像这样:

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...))时,如果它们做相同的事情,为什么两者都存在?或使用一个与另一个相比较的优点。

共有1个答案

笪煌
2023-03-14

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

关于您的实现方向,我认为您的自定义详细信息服务是正确的,我在过去做过无数次,它工作得很好。关于您关于用户角色和grantedauthority的问题--我认为将grantedauthority视为一个抽象是安全的,它允许您提供自定义字符串令牌来标识/分类某些用户/系统/等等。在一个团体里。这基本上是一个UserRole太对了?我不是Spring Security贡献者,但我猜测grantedauthority的创建只是为了在安全域上下文中抽象角色的概念。

通过将您的角色字符串放入grantedauthority中,您表示经过身份验证的用户具有以下权限--您可以说是角色。@preauthorize接受一个EL字符串,如果用户被“授予”,则该字符串可以与已验证用户的授予权限集合中的一个字符串匹配。如果用户没有被授予权限/角色,那么她就没有能力执行请求。对于你所问的,概念是一样的。

从Spring文档中:

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

此外,本页也很有帮助(参见:15.3方法安全表达式):Spring表达式

希望这能帮上忙。

 类似资料:
  • 我有以下问题。当使用下面的代码来更改用户的当前角色时,我收到了如下消息的异常: 附加“模型。实体。用户”类型的实体失败,因为另一个相同类型的实体已经具有相同的主键值。如果图形中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“修改”时可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态来跟踪图形,然

  • 我与拉雷维尔和托拉斯合作,基础工作很好。我确实有一个问题似乎不是随包而来的。我想要的是,当我执行时,如果他们登录,它也会返回他们的角色。目前我知道我可以做

  • 我正在研究使用JWT身份验证的Spring Security实现。我不确定如何检查用户角色并在方法级别获得经过身份验证的用户。我在网上看到这个例子: 我需要从JWT令牌中提取用户类型吗?还有其他方法可以实现吗?在我看来,仅使用是不完整的。 看起来这段代码是用来获得用户如果使用会话类型,我得到NPE。你知道对于JWT我如何才能成为用户吗? Github完整来源:https://Github.com/

  • 我一直在寻找使用各种AWS服务来处理我们下一个主要项目的基础设施。我们开始研究EC2实例上的docker容器,但在进一步研究AWS Lambda之后,这似乎是一条值得探索的道路。 使用AWS Lambda范例,我们只需使用Lambda函数作为逻辑粘合剂,将数据和事件(来自其他AWS服务)保存在一起。 例如,如果我们产品的用户创建了一个新记录,AWS Lambda可以在该事件中触发,我们可以调用La

  • 问题内容: 目前,我正在使用Spring Security编写Web应用程序。我们有一个通过用户名和密码对用户进行身份验证的Web服务。 网络服务: 如何配置Spring Security将提供的用户名和密码传递给Web服务? 我写了一个仅接收用户名的。 我认为问题出在您的xml中。您是否关闭了自动配置?并且您的类是否扩展AbstractUserDetailsAuthenticationProvi