添加自定义授权规则spring security

问题描述 投票:0回答:2

我在使用 Spring Security 实现以下授权规则时遇到问题: 用户资源只能由所有者或具有管理员角色的用户修改。我所说的修改是指触发 PUT 方法的 API 端点和此类 URL - some_path/user/{userId}

需要提及的条件:

  • 应用程序应用微服务,因此我的服务无法访问用户数据库
  • 授权的输入数据是授权标头中的 JWT。 JWT 包含“sub”值,即为其颁发令牌的用户 ID 和其角色的“roles”数组

如何以大多数 Spring Security 方式实现此类功能?我真的需要实现自己的 AuthorizationManager 吗?

java spring-security jwt authorization
2个回答
0
投票

您大致可以执行以下操作。您可以为 OAuth2 实现 spring-authorization-sever ,以拥有自定义 jwt 令牌和自定义 jwtAuthenticationConverter ,并且 GrantedAuthorities 具有根据您的要求的角色。读取权限的 JWT 令牌后,使用

@PreAuthorize
注释来限制对所述端点的访问。


0
投票

最简单的选择是使用“方法安全性”(

@EnableMethodSecurity
@EnableReactiveMethodSecurity
,具体取决于您的应用程序是 servlet 还是反应式应用程序)。

我将在下面考虑您的实体有一个包含用户主题的

owner
属性(或者您配置为在身份验证转换器中用作
name
的任何内容)。比如:

@Entity
@Data
@NoArgsConstructor
public class MyEntity {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false, updatable = false)
    private String owner;
}

public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {}

然后你就可以实现这样一个控制器:

@RestController
public class MyController {

    @PutMapping(path = "/my-entities/{entity-id}")
    @PreAuthorize("hasAuthority('admin') || #myEntity.owner == authentication.name")
    public ResponseEntity<Void> updateMyEntity(@PathVariable("entity-id") MyEntity myEntity, @RequestBody @Valid MyEntityeUpdateDto dto) {
        ...
        return ResponseEntity.accepted().build();
    }
}

我在这个项目中大量使用这种规则,例如在那个控制器中可以看到。

© www.soinside.com 2019 - 2024. All rights reserved.