0

Я использую аннотацию Spring Security @PreAuthorize, и она работает, когда я использую «известные хорошие» выражения, которые я видел в документации или в другие онлайн-примеры. Пример кода не является реальным прецедентом, он надуман.Как переменная сеанса может быть прочитана в выражении аннотации Spring, а именно @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, и если да, то как? Благодарю.

+0

Если вы используете Spring Security, почему вы хотите, чтобы проверить переменный сеанс вместо текущего пользователя. –

+0

У меня было сильное чувство, что «почему вы хотите это сделать» настроение появится почти сразу. «UserId» в исходном примере кода не является реальным прецедентом, поэтому он был заменен более общим примером, показывающим выполняемые выражения. В основном я хочу знать, есть ли простой способ доступа к объекту сеанса или объекту запроса через выражение аннотации. Это, в конечном счете, вопрос любопытства, потому что я не мог сделать что-то, что мне было бы легко. –

+0

Затем вы можете использовать образец, который не полагается или не разрешает аутентификацию. Запрос должен быть доступен, поэтому я бы ожидал 'request.session.getAttribute ('someValue')' на самом деле. Все ли они генерируют одно и то же исключение или разные? –

ответ

0

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

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

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

Попробуйте

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

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

+0

Кавычки в правильном месте в первом примере выше? Правильно ли синтаксис? Я получаю сообщение об ошибке «сессия не может быть разрешена к переменной» в STS/Eclipse, и нет быстрых исправлений. У меня были проблемы с кавычками в неправильном месте в моем первоначальном вопросе, но они исправили их.Я также пробовал #session без успеха, хотя синтаксис не был похож на ваш. Вопрос был отредактирован, чтобы быть более общим, потому что значение сеанса, которое я хочу протестировать, не связано с объектами аутентификации или принципами, поэтому я не могу использовать имя main.username. –