2012-07-21 1 views
18

Ich habe Probleme, einen Logout-Link in einer JSP-Seite nur anzuzeigen, wenn der Benutzer authentifiziert wurde. Hier ist die Ausnahme, die ich in dieser Zeile der JSP-Seite haben:Spring Security - Es konnte keine sichtbare WebSecurityExpressionHandler-Instanz im Anwendungskontext gefunden werden

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

Ausnahme:

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) 

Hier ist meine anwendungskontext 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> 

Ich verstehe dass ich Use-expression = "true" im HTTP-Tag verwenden könnte, aber das bedeutet, dass ich den Ausdruck in den intercept-URL-Tags und im Java-Code verwenden müsste. Gibt es eine Problemumgehung?

+0

Eine unabhängige Beobachtung. Der 'daoAuthenticationProvider' und' authenticationManager' in Ihrer Konfiguration werden nicht verwendet. –

Antwort

41

Sie können nur einen Kontext zu Ihrer Anwendung hinzufügen

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

aber der einfachste Weg ist nur Ausdrücke in Ihrer <http> Konfiguration zu ermöglichen, und man wird für Dich hinzugefügt werden. Dies bedeutet nur, dass Sie Ausdrücke in diesem Block verwenden müssen, nicht in Java-Code wie der Methode @Secured Annotationen.

+1

Sie haben Recht, ich musste nur Ausdruck innerhalb der Block verwenden. Das Problem ist behoben. – dukable

+10

und um absolut explizit zu sein, sollte Ihr Tag ein Attribut "use-expressions" enthalten, das auf "true" gesetzt ist, z.