spring security - 如何在自定义SPEL方法中修改@PostAuthorize的返回对象?

时间:2012-05-14 12:48:20

标签: spring spring-security spring-3

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

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

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

2 个答案:

答案 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)")后返回修改后的列表。