列表上的Spring安全ACL

时间:2014-04-02 19:12:35

标签: java spring spring-security acl

我对弹簧安全问题有疑问。

我有我的班级我有预先管理的方法并且运作良好

@PreAuthorize("hasPermission(#test, write) or hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERADMIN')")
    public void update(Test test) {
        testRepository.save(test);
        updateDeviceAcl(test);
    }

但是当我想在名单上做同样的事情时:

@PreAuthorize("hasPermission(#test, write) or hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERADMIN')")
    public void update(List<Test> test) {
        testRepository.save(test);
        updateDeviceAcl(test);
    }

它抛出异常:

java.lang.NoSuchMethodException: java.util.ArrayList.getId()

有可能这样做吗?我完全理解,那个方法

  

ArrayList.getId()

应该是那样的

  

test.get(ⅰ).getId();

感谢您的回答

1 个答案:

答案 0 :(得分:1)

如果授权只对完整列表有意义,那么为了执行此操作,您必须将列表包装在包含getId()方法的列表包装中:

public class ListWrapper { 
    private List<Test> tests;

    public Serializable getId() {
        ... some id ... 
    }
}

要逐个验证,您需要仅针对一个测试注释方法,而不是使用循环的方法:

public void update(List<Test> tests) {
    for (Test test : tests) {
        update(test);
    }
}

@PreAuthorize("hasPermission(#test, write) or hasAnyRole('ROLE_ADMIN', 'ROLE_SUPERADMIN')")
public void update(Test test) {
    testRepository.save(test);
    updateDeviceAcl(test);
}

如果您没有使用aspectJ编译时或加载时间编织来应用方面,那么将这两个方法放在单独的bean中并将一个方法注入另一个中。普通JDK或CGLIB代理不会对重入调用应用@PreAuthorize(或任何其他方面)。

相关问题