2011-04-21 16 views
9

Estoy intentando acceder a una referencia de frijol en una anotación de @PreAuthorize de la siguiente manera:primavera Lenguaje Expresión y Spring Security 3: el acceso a la referencia de frijol en @PreAuthorize

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

Tengo un grano de prueba configurado de la siguiente manera:

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

Cuando intento acceder al método testSpEL() Sin embargo, me enfrento con la siguiente excepción:

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) 

He realizado exhaustivamente mi investigación pero no puedo encontrar en ninguna parte lo que necesito cambiar en mi configuración para que esto funcione. ¿Alguna sugerencia?

Gracias!

Saludos cordiales, Jonck

P.S. Estoy usando Spring 3.0.5. El siguiente parece indicar que este tipo de funcionalidad debería funcionar:

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

+0

nunca he visto algo como: '@ testBean.getTestValue()' en @PreAuthorize. ¿Puede adjuntar un comentario con una URL a un ejemplo o documentación de esta función? – Ralph

+1

vistazo aquí: http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html en 6.5.12 frijol hace referencia a En los documentos de seguridad Primavera Dice que permite SpEL, por lo tanto, algo como esto debería ser posible. –

+0

¿Alguna vez ha probado las mismas expresiones en una anotación @Value – Ralph

Respuesta

5

He publicado una pregunta similar en SpringSource, resulta que de hecho la característica anterior todavía no es posible en la primavera de Seguridad 3.0.5. Por suerte versión 3.1.0.RC1 lo soporta, aunque con una sintaxis no estándar SpEL:

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

Aquí es la URL del hilo en el foro de SpringSource: SpringSource forum thread

Espero que esto ayude a alguien!

+0

También escribí una publicación de blog sobre este tema en caso de que quieras leer más al respecto: http://blog.42.nl/articles/spring-security -accessing-spring-beans-from-your-security-annotations –

+0

nice blog post. Parece que están en la sintaxis estándar ahora basada en la página 2 del hilo del foro vinculado. – digitaljoel

+0

Publicación del blog se movió aquí si alguien estuviera interesado: http://dontpanic.42.nl/2011/04/spring-security-accessing-spring-beans.html –

0

Para cualquiera atascado en la primavera de Seguridad 3.0 .x Tengo una solución algo simple. Añadir esta clase en su aplicación de securityContext.xml (o lo que sea):

https://gist.github.com/3340059

Se inyecta un BeanFactoryResolver en el Código de seguridad de Primavera, que es toda la solución 3.1.x Spring Security tiene. El soporte para la sintaxis ya está en 3.0.x. Se permite el uso de la sintaxis de la 3.1.x, Ala:

@PreAuthorize("@controller.theProperty")

Cuestiones relacionadas