Spring Expression Language и Spring Security 3: доступ к ссылке на bean-компонент в @PreAuthorize - PullRequest
9 голосов
/ 21 апреля 2011

Я пытаюсь получить доступ к ссылке на компонент в аннотации @PreAuthorize следующим образом:

@PreAuthorize("@testBean.getTestValue()")
public String testSpEL() {
    ....
}

У меня есть тестовый компонент, настроенный следующим образом:

@Component(value="testBean")
public class TestBean {
    public boolean getTestValue() {
        return true;
    }
}

Однако, когда я пытаюсь получить доступ к методу testSpEL (), я сталкиваюсь со следующим исключением:

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1057E:(pos 1): No bean resolver registered in the context to resolve access to bean 'testBean'
    at org.springframework.expression.spel.ast.BeanReference.getValueInternal(BeanReference.java:45)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:52)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:97)
    at org.springframework.security.access.expression.ExpressionUtils.evaluateAsBoolean(ExpressionUtils.java:11)

Я тщательно провел исследование, но нигде не могу найти то, что мне нужно изменить в моей конфигурации, чтобы заставить это работать. Есть указатели?

Спасибо!

С уважением, Jonck

P.S. Я использую Spring 3.0.5. Кажется, следующее указывает на то, что этот тип функциональности должен работать:

https://jira.springsource.org/browse/SPR-7173

Ответы [ 3 ]

6 голосов
/ 22 апреля 2011

Я опубликовал аналогичный вопрос на SpringSource, оказывается, что действительно вышеупомянутая функция еще не поддерживается в Spring Security 3.0.5.К счастью, версия 3.1.0.RC1 поддерживает ее, хотя и с нестандартным синтаксисом SpEL:

@PreAuthorize("testBean.getTestValue()")
public String testSpEL() {
    ....
}

Вот URL-адрес темы на форуме SpringSource: Тема на форуме SpringSource

Надеюсь, это кому-нибудь поможет!

2 голосов
/ 24 июля 2012

В Spring Security 3.1 (с версии 3.1.RC2)

@PreAuthorize("testBean.getTestValue()") 

не работает - вместо этого вы должны написать

@PreAuthorize("@testBean.getTestValue()")

См. https://jira.springsource.org/browse/SEC-1723

0 голосов
/ 13 августа 2012

Для тех, кто застрял в Spring Security 3.0.x, у меня есть несколько простой обходной путь. Добавьте этот класс в ваш application-securityContext.xml (или любой другой):

https://gist.github.com/3340059

Он внедряет BeanFactoryResolver в код Spring Security, который есть во всех исправлениях Spring Security 3.1.x. Поддержка синтаксиса уже есть в 3.0.x. Позволяет использовать синтаксис из 3.1.x, ala:

@PreAuthorize("@controller.theProperty")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...