2012-07-21 10 views
18

Mam problem z wyświetlaniem łącza wylogowania na stronie JSP, tylko jeśli użytkownik jest uwierzytelniony. Oto wyjątek mam w tej linii strony JSP:Zabezpieczenia sprężyny - brak widocznej instancji WebSecurityExpressionHandler w kontekście aplikacji

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

wyjątek:

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) 

Oto mój wniosek-context-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> 

Rozumiem że mogę użyć wyrażenia use-expression = "true" w znaczniku http, ale to oznacza, że ​​będę musiał użyć wyrażenia w tagach przechwytujących-url iw kodzie java. Czy jest w pobliżu praca?

+0

Niepowiązana obserwacja. 'DaoAuthenticationProvider' i' authenticationManager' w Twojej konfiguracji nie są używane. –

Odpowiedz

41

Można tylko dodać jeden do kontekstu aplikacji

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

ale najłatwiej jest właśnie umożliwienie wyrażenia w konfiguracji <http>, a jeden zostanie dodany do ciebie. Oznacza to tylko, że musisz używać wyrażeń w tym bloku, a nie w kodzie Java, takich jak adnotacje z metody @Secured.

+1

Masz rację, po prostu musiałem użyć wyrażenia w bloku . Problem jest rozwiązany. – dukable

+10

i aby być całkowicie jednoznacznym, Twój znacznik powinien zawierać atrybut "wyrażeń użycia" ustawiony na wartość true, np.

Powiązane problemy