【发布时间】:2015-05-09 12:12:24
【问题描述】:
我使用的是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 请求时,JSR303 验证器将在 @PreAuthorize 之前启动。 例如,非管理员用户最终会得到类似“需要名字”而不是“拒绝访问”的内容。但是在用户提供名字变量以通过验证器后,访问被拒绝。
有谁知道如何在@Valid 或@Validated 之前强制检查@PreAuthorize?
为了执行一些复杂的规则检查,我必须使用这种方法级别的授权而不是基于 url 的授权。
【问题讨论】:
-
这永远不会发生。
@PreAuthorize仅在方法执行时被调用。但是,@Valid在准备方法执行时进行处理,这发生在方法的实际执行之前。所以这行不通。作为一种解决方法,您可以进行手动验证,而不是依赖@Valid注释。 -
我明白了。感谢您解释它是如何在后台工作的。我认为如果他们将来能够支持 PreAuthorize 之后的验证,那就太好了。
-
这会很困难,因为这会改变 AOP 的整个工作方式:)。我可以看到映射 url 和增加安全性的改进。目前只使用了 ant 样式表达式和正则表达式,但是我可以看到人们可能还想使用路径变量来保证安全。
标签: spring-mvc spring-security controller bean-validation role-base-authorization