如何在控制器中验证(@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_USER
或 ROLE_ADMIN
请求 /route1
。
但是现在,ROLE_USER
只有当他们是资源所有者时才被允许。为此,您必须解析方法参数以了解您请求的资源。然后,在 @PreAuthorize
中,你可以这样做:
@PreAuthorize("@myBean.isResourceOwner(resourceId, authentication)")
@PutMapping("/{resourceId}")
public void update(@PathVariable Long resourceId) {
...
}
我正在使用 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_USER
或 ROLE_ADMIN
请求 /route1
。
但是现在,ROLE_USER
只有当他们是资源所有者时才被允许。为此,您必须解析方法参数以了解您请求的资源。然后,在 @PreAuthorize
中,你可以这样做:
@PreAuthorize("@myBean.isResourceOwner(resourceId, authentication)")
@PutMapping("/{resourceId}")
public void update(@PathVariable Long resourceId) {
...
}