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

时间:2015-01-27 10:22:14

标签: java spring spring-mvc spring-security spring-boot

我有春天豆,我有两种方法

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

2 个答案:

答案 0 :(得分:2)

当您直接从changeData()致电update()时,您不会通过代理。仅使用带注释的行为增强代理呼叫。

你可以将该方法移动到另一个bean,但你也可以在同一个bean中调用它,但是通过代理使用类似的东西:

@Secured({"ROLE_ADMIN"})
public void update(Person person) {  
   if(person.isActive()) {
      context.getBean(MyBean.class).changeData(person);
   }
}

答案 1 :(得分:0)

在调用update方法时考虑使用@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(...)后需要执行额外的代码,则此方法可能不适合您。