2012-07-21 38 views
18

Tôi gặp sự cố khi hiển thị liên kết đăng xuất trong trang JSP chỉ khi người dùng được xác thực. Dưới đây là ngoại lệ Tôi có ít dòng này của trang JSP:Bảo mật mùa xuân - Không thể nhìn thấy cá thể WebSecurityExpressionHandler trong ngữ cảnh ứng dụng

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

Ngoại lệ:

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) 

ở đây là tôi ứng dụng bối cảnh 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> 

Tôi hiểu mà tôi có thể sử dụng use-expression = "true" trong thẻ http nhưng điều đó có nghĩa là tôi sẽ phải sử dụng biểu thức trong thẻ chặn url và trong mã java. Có cách giải quyết nào không?

+0

Quan sát không liên quan. 'DaoAuthenticationProvider' và' authenticationManager' trong cấu hình của bạn không được sử dụng. –

Trả lời

41

Bạn chỉ có thể thêm một đến bối cảnh ứng dụng của bạn

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

nhưng cách đơn giản nhất là chỉ để cho phép biểu thức trong cấu hình <http> của bạn, và ai sẽ được bổ sung cho bạn. Điều này chỉ có nghĩa là bạn phải sử dụng các biểu thức trong khối đó, không phải trong mã Java, chẳng hạn như chú thích phương thức @Secured.

+1

Bạn nói đúng, tôi chỉ phải sử dụng biểu thức trong khối . Vấn đề đã được giải quyết. – dukable

+10

và hoàn toàn rõ ràng, thẻ của bạn nên bao gồm thuộc tính "biểu thức sử dụng" được đặt thành true, ví dụ:

Các vấn đề liên quan