Как работают @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")
хотя эти фильтры полезны, это действительно неэффективно с большими наборами данных, и в основном вы теряете контроль над результатом, а не Весна контролирует результат.