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

Spring security具有任意角色和不同权限的不同流

赵夕
2023-03-14

在我的Spring Boot应用程序中,我有一个REST控制器,其方法如下:

@PreAuthorize("hasAnyRole('PERMISSION_UPDATE_OWN_COMMENT', 'PERMISSION_UPDATE_ANY_COMMENT')")
@RequestMapping(value = "/update", method = RequestMethod.POST)
public CommentResponse updateComment(@AuthenticationPrincipal User user, @Valid @RequestBody UpdateCommentRequest commentRequest) {
    Comment comment = commentService.updateComment(commentRequest.getCommentId(), commentRequest.getTitle(), commentRequest.getContent(), user);
    return new CommentResponse(comment);
}

只有具有权限\u UPDATE\u OWN\u COMMENT或权限\u UPDATE\u ANY\u COMMENT的用户才能使用此endpoint。

在这个方法中,我需要创建两个不同的流-一个用于具有PERMISSION_UPDATE_OWN_COMMENT的用户,另一个用于具有PERMISSION_UPDATE_ANY_COMMENT权限的用户。

所以我的问题是——为了在单个方法中实现这些不同的逻辑流,Spring Security性的最佳实践是什么?

我应该在updateComment方法中验证用户具有一个或另一个权限并基于此条件实现我的逻辑吗?

共有1个答案

柯默
2023-03-14

最简单的方法是在控制器内部做updateComment函数内部的逻辑。因为,你可以很容易地从action参数中获取SecurityContextHolderAware Request estWrapper的实例来查找角色。

但最好的做法是将您的逻辑放入服务中。这将使您更容易在其他地方重用逻辑,如RESTFul API。

因此,您可以使用下面的代码或类似的代码来检查服务中的角色。

Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
boolean authorized = authorities.contains(new SimpleGrantedAuthority("PERMISSION_UPDATE_OWN_COMMENT"));

(编辑了更多信息)

完整的函数,可用于检查角色

protected boolean roleExist(String role) {
    SecurityContext context = SecurityContextHolder.getContext();
    Authentication authentication = context.getAuthentication();
    for (GrantedAuthority auth : authentication.getAuthorities()) {
        if (role.equals(auth.getAuthority()))
            return true;
    }
    return false;
}
 类似资料:
  • 我最常看到基于角色的访问控制(RBAC)需要权限才能执行操作。为主题分配了授予其权限的角色。 我最近遇到了一个授权库,它没有权限和角色的单独概念。主体仍然被授予角色,但是授权检查直接对角色进行,并且没有权限的概念。我担心这种设计有缺点,因为我很少看到它。以这种方式组合角色和权限可能会出现什么问题?在这个系统中,什么事情更困难?

  • 问题内容: 我正在尝试设置具有权限的基于角色的安全性。我正在尝试与Spring-Security一起执行此操作。 我不想设置ACL,因为这似乎对我的要求来说有些过头了。 我只想拥有本文所述的简单权限和角色。不幸的是,本文没有描述如何实现给定的解决方案。 有人已经尝试过了,可以指出正确的方向吗?也许还有另一个博客条目描述了实现方式? 非常感谢你。 问题答案: 要实现这一点,您似乎必须: 创建模型(用

  • 所以С能否请您向我解释一下,正确的方法是否是为不同类型的用户提供不同的DBContext。 例如:我们有两种方法的ApicController: 之后,每个命令都依赖于具有不同配置的不同服务/DbContext。例如: 我觉得我错过了什么或者有更好的解决办法

  • 我有一个Spring MVC Web应用程序,其中Thymeleaf作为模板引擎,Spring Security用于管理登录阶段。 我的用户可以使用不同的角色(ROLE\u ADMIN、ROLE\u USER和ROLE\u GUEST)登录。此外,角色为Role\u user的用户是一个或多个工作组(一组用户)的一部分,在工作组中,他/她可以使用不同的权限进行操作:WG\u ADMIN、WG\u

  • 我正在使用Apache Shiro(v1.2.3),我正确地设置了用户名/密码身份验证,并且它正在工作(我将密码散列和salt存储在远程数据库中)。我现在正在尝试使用角色设置权限。我有一个扩展的领域,例如。 我的如下所示: credentialsMatcher=org.apache.shiro.authc.Credential.sha256CredentialsMatcher credential

  • 问题内容: 假设我是普通用户还是超级用户,我想显示不同的列。 覆盖在已经完全没有效果 并且定义条件类属性也不起作用(未定义)(根据上的错误)。在等效的中做同样的事情,仍然没有定义 仅供参考,可以是从前面提到的问题继承的任何类。 问题答案: 我通常定义视图类属性,例如属性。它允许你向其中添加一些动态逻辑: 使用这种方法的问题(以及为什么在函数中重新分配值不起作用)是许多视图属性在应用程序启动时被缓存