如何在控制器中验证(@Valid)之前检查安全访问?

How to check security access before validation (@Valid) in Controller?

我正在使用 Spring Boot 2.5 创建一个 Restful API,我想知道在检查某些路由的角色时实施验证的正确方法。此外,对于某些路由,我需要确保只有管理员才能修改资源或其所有者。

@PreAuthorize 似乎是解决方案,但 @Valid 似乎是在实际方法调用之前处理的,否则称为在 @PreAuthorize.

之前执行

参见:How to check security acess (@Secured or @PreAuthorize) before validation (@Valid) in my Controller?

这真的是唯一可用且 干净 的解决方案来制作 Restful API 具有验证和角色 Spring 引导 & Spring安全性?

恐怕这是最干净的解决方案。 要检查某些路由的角色,您可以将 HttpSecurity 配置为在到达控制器之前检查角色,如下所示:

@Bean
SecurityFilterChain app(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests((requests) -> requests
        .antMatchers("/route1").hasAnyRole("ADMIN", "USER")
    )
    return http.build();
}

因此,使用此配置,您确保只允许 ROLE_USERROLE_ADMIN 请求 /route1

但是现在,ROLE_USER 只有当他们是资源所有者时才被允许。为此,您必须解析方法参数以了解您请求的资源。然后,在 @PreAuthorize 中,你可以这样做:

@PreAuthorize("@myBean.isResourceOwner(resourceId, authentication)")
@PutMapping("/{resourceId}")
public void update(@PathVariable Long resourceId) {
    ...
}