Как переменная сеанса может быть прочитана в выражении аннотации Spring, в частности @PreAuthorize

Я использую аннотацию 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, и если да, то как? Спасибо.


person Night Owl    schedule 01.05.2016    source источник
comment
Если вы используете Spring Security, зачем вам проверять переменную сеанса вместо текущего пользователя, вошедшего в систему.   -  person M. Deinum    schedule 01.05.2016
comment
У меня было сильное ощущение, что вопрос о том, почему вы хотите сделать это, всплывет почти сразу. Идентификатор пользователя в исходном примере кода не является реальным вариантом использования, поэтому он был заменен более общим примером, показывающим работающие выражения. В основном я хочу знать, есть ли простой способ доступа к объекту сеанса или объекту запроса через выражение аннотации. В конечном счете, это вопрос любопытства, потому что я не мог сделать то, что, как мне казалось, было бы легко.   -  person Night Owl    schedule 01.05.2016
comment
Затем вы можете использовать образец, который не полагается на аутентификацию и не разрешает ее. Запрос должен быть доступен, поэтому я ожидаю, что request.session.getAttribute('someValue') действительно сработает. Все они генерируют одно и то же исключение или разные?   -  person M. Deinum    schedule 02.05.2016


Ответы (1)


Весеннее выражение EL для тока равно #session. Таким образом, вы могли бы использовать

@PreAuthorize("#userId == session.userId")

Но этот сеанс является текущим HttpSession и не имеет свойства userId. Согласно spring el access вы можете использовать authentication или principal

Пытаться

@PreAuthorize("#userId == principal.username")

предполагая, что имя пользователя является userId...

person Stefan Isele - prefabware.com    schedule 01.05.2016
comment
Находятся ли кавычки в правильном месте в вашем первом примере выше? И правильный ли синтаксис? Я получаю, что сеанс не может быть разрешен для переменной ошибки в STS/Eclipse, и нет доступных быстрых исправлений. У меня были проблемы с кавычками в неправильном месте в моем исходном вопросе, но я их исправил. Я также безуспешно пробовал #session, хотя синтаксис не был похож на ваш. Вопрос был отредактирован, чтобы быть более общим, потому что значение сеанса, которое я хочу проверить, не связано с объектами аутентификации или принципа, поэтому я не могу использовать принципал.имя пользователя. - person Night Owl; 02.05.2016