복붙노트

[SPRING] 스프링 표현 언어와 스프링 보안 3 : @PreAuthorize에서 빈 참조에 접근하기

SPRING

스프링 표현 언어와 스프링 보안 3 : @PreAuthorize에서 빈 참조에 접근하기

다음과 같이 @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

추신 Spring 3.0.5를 사용하고 있습니다. 다음은 이러한 유형의 기능이 작동 함을 나타냅니다.

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

해결법

  1. ==============================

    1.SpringSource에서 유사한 질문을 게시했는데 실제로 위의 기능은 Spring Security 3.0.5에서 아직 지원되지 않습니다. 운좋게도 버전 3.1.0.RC1은 비표준 SpEL 구문을 사용하여 지원합니다.

    SpringSource에서 유사한 질문을 게시했는데 실제로 위의 기능은 Spring Security 3.0.5에서 아직 지원되지 않습니다. 운좋게도 버전 3.1.0.RC1은 비표준 SpEL 구문을 사용하여 지원합니다.

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

    다음은 SpringSource 포럼의 스레드 URL입니다. SpringSource 포럼 스레드

    희망이 사람을 돕는다!

  2. ==============================

    2.Spring Security 3.1 (3.1.RC2 이후)

    Spring Security 3.1 (3.1.RC2 이후)

    @PreAuthorize("testBean.getTestValue()") 
    

    작동하지 않습니다 - 대신 쓰기해야합니다

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

    https://jira.springsource.org/browse/SEC-1723을 참조하십시오.

  3. ==============================

    3.스프링 시큐리티 3.0.x에 갇힌 사람에게는 다소 간단한 해결 방법이 있습니다. application-securityContext.xml (또는 무엇이든)에이 클래스를 추가합니다.

    스프링 시큐리티 3.0.x에 갇힌 사람에게는 다소 간단한 해결 방법이 있습니다. application-securityContext.xml (또는 무엇이든)에이 클래스를 추가합니다.

    https://gist.github.com/3340059

    Spring 보안 코드에 BeanFactoryResolver를 삽입합니다.이 코드는 Spring Security 3.1.x의 모든 수정 사항입니다. 구문 지원은 이미 3.0.x에 있습니다. 그것은 3.1.x, ala의 구문을 사용할 수있게합니다 :

    @PreAuthorize ( "@ controller.theProperty")

  4. from https://stackoverflow.com/questions/5743565/spring-expression-language-and-spring-security-3-accessing-bean-reference-in-p by cc-by-sa and MIT license