Spring安全性和@PostFilter

mad*_*ada 0 spring-security

我有这个对象:

@Service
public class myBr {

    @PostFilter("filterObject.cellule.getId()==2")
    public List<Bibliotheque> getB() {
        return super.getAll();
    }

    public List<Bibliotheque> getA() {
        return getB();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我从测试中调用时myBr.getB(),@PostFilter会应用,但是当我调用时myBr.getA(),后置过滤器不起作用.

有没有办法处理这个,以便应用过滤器?

Don*_*ows 10

问题是,@PostFilter通过AOP技术应用,但您呼叫的实例的执行getB()直接getA()和Spring AOP的不重写类.

这是发生了什么:

      +————————+      +——————————+
 getA |  pass  | getA |          |
—————>|·······>|—————>|          |———+
      |        |      |          |   |
      |  Bean  |      | Instance |   | this.getB
      |        |      |          |   |
 getB | filter | getB |          |   |
—————>|·······>|—————>|          |<——+
      |        |      |          |
      +————————+      +——————————+
Run Code Online (Sandbox Code Playgroud)

Spring AOP将代理对象作为委托给bean的实际bean,通过使用JDK代理对象(当你有一个合适的接口时)或者使用CGLIB来重新合成对象.因为getA它直接通过,因为getB它将调用插入后过滤代码.这很好,但它确实意味着当实例 - 你在this里面得到的对象getA- 用于getB直接调用时,它会跳过过滤器并直接跳转到底层代码.

有四种可能的修复方法.

  1. 使用AspectJ来执行AOP代码的应用程序,该代码进行代码重写(代价是部署中的复杂性更高).
  2. 将bean的句柄提供给实例(必须明确地完成;您不能自动装配它)并getB通过它调用.
  3. 放入getB不同的豆子.
  4. 对这两种方法进行过滤.

我自己使用了#2选项(在我的特定情况下它比其他选项更容易)并且它运行得很好,但最好的选择几乎肯定是#3,所以你不需要自己调用"界面"方法; 这种事情通常表明应用程序功能的分区不正确.