我在使用 Spring Security 实现以下授权规则时遇到问题: 用户资源只能由所有者或具有管理员角色的用户修改。我所说的修改是指触发 PUT 方法的 API 端点和此类 URL - some_path/user/{userId}
需要提及的条件:
如何以大多数 Spring Security 方式实现此类功能?我真的需要实现自己的 AuthorizationManager 吗?
您大致可以执行以下操作。您可以为 OAuth2 实现 spring-authorization-sever ,以拥有自定义 jwt 令牌和自定义 jwtAuthenticationConverter ,并且 GrantedAuthorities 具有根据您的要求的角色。读取权限的 JWT 令牌后,使用
@PreAuthorize
注释来限制对所述端点的访问。
最简单的选择是使用“方法安全性”(
@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();
}
}