我正在使用Spring Boot,并且已经通过WebSecurityConfigurerAdapter启用了全局方法安全性。
@EnableGlobalMethodSecurity(prePostEnabled = true, order = Ordered.HIGHEST_PRECEDENCE)
以下是我的控制器代码
@PreAuthorize("hasAnyRole('admin') or principal.id == id")
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
public User updateUser(@PathVariable("id") String id, @Valid @RequestBody UserDto userDto)
{ ....}
然而,当非管理员用户尝试进行PUT请求时,在@PreAuthorize之前JSR303验证器将会触发。 例如,非管理员用户最终会得到类似于“需要提供名字”的错误信息,而不是“拒绝访问”。但是在用户提供名字变量以通过验证器后,将返回“拒绝访问”。
有人知道如何强制使@PreAuthorize在@Valid或@Validated之前被检查吗?
我必须使用这种基于方法的授权方式来执行一些复杂的规则检查,而不能使用基于URL的授权方式。
@PreAuthorize
只有在方法执行时才会被调用。然而,@Valid
在准备执行方法时就会被处理,这发生在实际执行方法之前。所以这样做行不通。作为一种解决方法,您可以手动验证,而不是依赖于@Valid
注释。 - M. Deinum