2012-05-14 1 views
1

Я хочу фильтровать коллекцию, возвращаемую методом службы. Эта фильтрация включала бы вызов другого метода службы и, следовательно, я не собираюсь для @PostFilter, так как он вызывает выражение SPEL внутри аннотации для каждого элемента коллекции. Вместо этого я использую @PostAuthorize следующим образом:spring security - Как изменить возвращаемый объект @PostAuthorize в пользовательском методе SPEL?

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

В canAssignToUser, я стараюсь, чтобы удалить пользователей из списка возврата переданного ему. По-видимому, это проблема, и есть некоторые ограничения на изменение возвращаемого списка. Как изменить возвращаемый список из метода с помощью аннотаций на уровне метода и без вызова SPEL для каждого элемента списка.

ответ

1

@PostAuthorize используется для оценки значения boolean, поэтому перехватчик не передает возвращаемое значение в выражение (смотрите here). Каков ваш метод удаления элементов без проверки каждого элемента? (Как @PostFilter делает)

Я думаю, что у вас нет выбора, если вы хотите использовать Spring Security для фильтрации

+0

Перед вызовом метода оценкиAsBoolean для postAuthorize он устанавливает возвращаемый объект в обработчик выражения. Фактически мы можем получить всю коллекцию в пользовательском выражении SPEL. Единственная проблема заключается в том, что мы не можем ее модифицировать. И моя проблема заключается не в том, что я разбираю каждый элемент перед его удалением, его для проверки каждого элемента, мой пользовательский метод SPEL вызывается. Я хочу, чтобы мой метод вызывался только один раз, при этом вся коллекция передавалась ему, что Я могу изменить его ... но у тебя не всегда можно получить все, что захочет :) – Daud

0

Вы можете изменить возвращаемый объект, как вам нравится. Несмотря на то, что перехватчик не возвращает объект, который вы передали, он получает уведомление об изменениях объекта. В конце концов объект returnObject изменяется. (Примечание: пользовательский метод безопасности внутри @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)").