@PreAuthorize 在 Spring 控制器中的嵌套方法上
我有spring bean,其中有两种方法
@Secured({"ROLE_ADMIN"})
public void update(Person person) {
if(person.isActive())
changeData(person);
}
@PreAuthorize("hasPermission(#person,CHANGE_PERSON_FULL)")
public void changeData(Person person) {
...
}
我已经添加了我的自定义MethodSecurityExpressionHandler
。我有设置@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
。@PreAuthorize
当注释在上面时,一切正常update(Person person)
。我需要对 changeData 执行 PreAuthorize。它与代理有关吗?我是否需要使用方法 changeData 创建单独的 bean?是否可以强制弹簧检查嵌套方法的安全性?
在调用更新方法时考虑使用@PreFilter
注释,这也将消除if
语句的使用。
像这样的东西应该工作:
@PreAuthorize("hasRole('ROLE_ADMIN')")
@PreFilter("hasPermission(#person, CHANGE_PERSON_FULL) and hasPermission(#person.active == true)")
public void update(Person person) {
changeData(person);
}
请注意,如果您有额外的代码需要在调用changeData(...)
此方法后执行,则可能不适合您。
当您
changeData()
直接从调用时update()
,您不会通过代理。只有代理调用通过带注释的行为得到增强。您可以将该方法移动到另一个 bean,但您也可以在同一个 bean 中调用它,但通过代理使用如下所示: