Я использую аннотацию Spring Security @PreAuthorize, и она работает, когда я использую «известно хорошие» выражения, которые я видел в документации или в других онлайн-примерах. Пример кода не является реальным вариантом использования, он надуманный.
Все следующие выражения являются вариациями выражений, которые работали с методом или методами, подобными по формату приведенному ниже примеру метода. Эти выражения не используются одновременно или даже одним и тем же методом, они просто отображаются здесь вместе для простоты.
@PreAuthorize("hasRole('ROLE_ADMIN')")
@PreAuthorize("hasAuthority('PERM_XYZ') or authentication.principal.id == #ownerId")
@PreAuthorize("hasRole('ROLE_USER') and #someValue == 'testValue'")
public List<Item> getSomeItems(Integer ownerId, String someValue ) {
// code goes here
}
Что я хотел бы сделать, так это проверить аргумент метода на соответствие переменной сеанса в таком выражении:
@PreAuthorize("hasAuthority('PERM_XYZ') or #someValue == session.someOtherValue")
public List<Item> getSomeItems(Integer someValue) {
// code goes here
}
Я бы подумал, что доступ к сеансу в выражении будет простой задачей, но я не нашел ни одного примера в Интернете или даже никого, кто спрашивал бы, как это сделать.
Я пробовал все следующие и многие другие, но все они генерируют исключения:
@PreAuthorize("#someValue == #session.someValue")
@PreAuthorize("#someValue == session.someValue")
@PreAuthorize("#someValue == session.getAttribute('someValue')")
@PreAuthorize("#someValue == request.session.someValue")
@PreAuthorize("#someValue == request.session.getAttribute('someValue')")
Все вышеперечисленное связано с Spring Security и аннотацией @PreAuthorize, но эти вещи на самом деле не являются центральными для вопроса.
Я знаю о многих альтернативах доступа к сеансу и уже решил свой вариант использования, но мне все еще интересно, можно ли получить доступ к сеансу через выражение в любой аннотации.
Итак... можно ли получить доступ к сеансу пользователя в выражении аннотации Spring, и если да, то как? Спасибо.
request.session.getAttribute('someValue')
действительно сработает. Все они генерируют одно и то же исключение или разные? - person M. Deinum   schedule 02.05.2016