2012-07-21 12 views
18

Estoy teniendo problemas para mostrar un vínculo de cierre de sesión en una página JSP sólo si el usuario es autenticado. Aquí es la excepción que tengo en esta línea de la página JSP:Spring Security - Ningún caso WebSecurityExpressionHandler visible se pudo encontrar en el contexto de aplicación

<sec:authorize access="isAuthenticated()"> 

Excepción:

Stacktrace: 
.... 

root cause 

javax.servlet.jsp.JspException: No visible WebSecurityExpressionHandler instance could be found in the application context. There must be at least one in order to support expressions in JSP 'authorize' tags. 
    org.springframework.security.taglibs.authz.AuthorizeTag.getExpressionHandler(AuthorizeTag.java:100) 
    org.springframework.security.taglibs.authz.AuthorizeTag.authorizeUsingAccessExpression(AuthorizeTag.java:58) 

aquí es mi contexto de aplicación security.xml:

<http auto-config='true' > 
    <intercept-url pattern="/user/**" access="ROLE_User" /> 
    <logout logout-success-url="/hello.htm" /> 
</http> 

<beans:bean id="daoAuthenticationProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <beans:property name="userDetailsService" ref="userDetailsService" /> 
</beans:bean> 

<beans:bean id="authenticationManager" 
    class="org.springframework.security.authentication.ProviderManager"> 
    <beans:property name="providers"> 
     <beans:list> 
      <beans:ref local="daoAuthenticationProvider" /> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

<authentication-manager> 
    <authentication-provider user-service-ref="userDetailsService"> 
     <password-encoder hash="plaintext" /> 
    </authentication-provider> 
</authentication-manager> 

entiendo que podría usar use-expression = "true" en la etiqueta http pero eso significa que tendría que usar expression en las etiquetas intercept-url y en el código java. ¿Hay alguna solución?

+0

Una observación no relacionado. El 'daoAuthenticationProvider' y' authenticationManager' en su configuración no se están utilizando. –

Respuesta

41

Puede acaba de añadir uno a su contexto de aplicación

<bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" /> 

pero la forma más fácil es simplemente para permitir expresiones en su configuración de <http>, y uno se agregará para usted. Esto solo significa que debe usar expresiones dentro de ese bloque, no en código Java, como las anotaciones del método @Secured.

+1

Tienes razón, solo tuve que usar la expresión dentro del bloque . El problema esta resuelto. – dukable

+10

y estar absolutamente explícita, su etiqueta debe incluir un atributo de "uso-expresiones" se define como true, por ejemplo,

Cuestiones relacionadas