我对弹簧安全问题有疑问。
我有我的班级我有预先管理的方法并且运作良好
@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();
感谢您的回答
答案 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
(或任何其他方面)。