我希望过滤服务方法返回的集合。此过滤将涉及调用另一个服务方法,因此我不会使用@PostFilter
因为它在集合中的每个元素的注释内调用SPEL
表达式。相反,我使用@PostAuthorize
如下:
@PostAuthorize("canAssignToUser(returnObject)")
List<UserInfo> getUsers(int userId);
在canAssignToUser
中,我试图从传递给它的返回列表中删除用户。显然,这是一个问题,修改返回的列表有一些限制。如何使用方法级注释从方法修改返回的列表,并且不为列表的每个元素调用SPEL表达式。
答案 0 :(得分:2)
@PostAuthorize
用于评估boolean
值,因此拦截器不会将返回值传递给表达式(look here)。
你在不检查每个元素的情况下删除元素的方法是什么? (就像@PostFilter
那样)
如果您想使用Spring Security进行过滤,我认为您没有选择
答案 1 :(得分:0)
您可以根据需要修改返回的对象。即使拦截器没有返回您传递的对象,它也会收到对象更改的通知。最终修改了returnedObject。 (注意:@PostAuthorize
内的自定义安全方法只能返回布尔值。)
public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
public CustomMethodSecurityExpressionRoot(Authentication authentication) {
super(authentication);
}
public boolean canAssignToUser(Object returnObject) {
// do modifications to returnObject
return true;
}
getUsers()方法在评估@PostAuthorize("canAssignToUser(returnObject)")
后返回修改后的列表。