2

我希望过滤服务方法返回的集合。此过滤将涉及调用另一个服务方法,因此我不打算这样做,因为它会为集合的每个元素@PostFilter调用注释内的表达式。SPEL相反,我使用@PostAuthorize如下:

@PostAuthorize("canAssignToUser(returnObject)")
List<UserInfo> getUsers(int userId);

在 中canAssignToUser,我试图从传递给它的返回列表中删除用户。显然,这是一个问题,修改返回的列表有一些限制。如何使用方法级注释修改从方法返回的列表,并且不对列表的每个元素调用 SPEL 表达式。

4

2 回答 2

2

@PostAuthorize用于评估值,因此boolean拦截器不会将返回值传递给表达式,(看这里)。您在不检查每个元素的情况下删除元素的方法是什么?(就像@PostFilter那样)

如果您想使用 Spring Security 进行过滤,我认为您别无选择

于 2012-05-14T13:44:53.180 回答
0

您可以根据需要修改返回的对象。即使拦截器没有返回您传递的对象,它也会收到有关对象更改的通知。最终返回的对象被修改。(注意:里面的自定义安全方法@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)")

于 2016-06-08T05:17:06.790 回答