Spring Security: no se pudo encontrar una instancia visible de WebSecurityExpressionHandler en el contexto de la aplicación
Tengo problemas para mostrar un enlace de cierre de sesión en una página JSP solo si el usuario está autenticado. Aquí está la excepción que tengo en esta línea de la página JSP:
<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í está mi aplicación-contexto-Seguridad.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 expresión en las etiquetas intercept-url y en el código java. ¿Hay una solución?