@PreAuthorize 在 Spring 控制器中的嵌套方法上

IT小君   2022-11-10T00:11:02

我有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?是否可以强制弹簧检查嵌套方法的安全性?

点击广告,支持我们为你提供更好的服务
评论(2)
IT小君

当您changeData()直接从调用时update(),您不会通过代理。只有代理调用通过带注释的行为得到增强。

您可以将该方法移动到另一个 bean,但您也可以在同一个 bean 中调用它,但通过代理使用如下所示:

@Secured({"ROLE_ADMIN"})
public void update(Person person) {  
   if(person.isActive()) {
      context.getBean(MyBean.class).changeData(person);
   }
}
2022-11-10T00:11:02   回复
IT小君

在调用更新方法时考虑使用@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(...)此方法后执行,则可能不适合您。

2022-11-10T00:11:03   回复