Как работают @PostFilter и @PreFilter

будучи новым для весенних аннотаций, мне нужно разъяснение для приведенного ниже кода.

@PostFilter("hasPermission(filterObject, 'READ') or hasRole('ROLE_ADMIN')")

    public List<User> getUsers(String orderByInsertionDate,
            Integer numberDaysToLookBack) throws AppException

;

таким образом, это означает, что список пользователей, возвращаемых getUsers, будет содержать только те элементы, которые имеют full "READ" доступ к вызывающему объекту или вызывающему объекту имеет роль "ROLE_ADMIN". Спасибо.

1 ответов


@PreFilter и @PostFilter предназначены для использования с Spring security, чтобы иметь возможность фильтровать коллекции или массивы на основе авторизации.

чтобы это работало, вам нужно использовать управление доступом на основе выражений в spring security (как в вашем примере)

@PreFilter - фильтрует коллекцию или массивы перед выполнением метода.

@PostFilter - фильтрует возвращенную коллекцию или массивы после выполнения метод.

Итак, допустим, ваша getUser() возвращает список пользователей. Spring Security будет перебирать список и удалять любые элементы, для которых примененное выражение является ложным (например, не является администратором и не имеет разрешения на чтение)

filterObject-это встроенный объект, на котором выполняется операция фильтра, и вы можете применить различные условия к этому объекту (в основном все встроенные выражения доступны здесь, например principal, authentication), например, вы можете do

@PostFilter ("filterObject.owner == authentication.name")

хотя эти фильтры полезны, это действительно неэффективно с большими наборами данных, и в основном вы теряете контроль над результатом, а не Весна контролирует результат.