【问题标题】:@PreAuthorize on a nested method in Spring controller@PreAuthorize 在 Spring 控制器中的嵌套方法上
【发布时间】:2015-03-25 22:15:59
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-08-03
        • 2011-03-06
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        • 1970-01-01
        • 2015-01-16
        相关资源
        最近更新 更多