2010-11-11 48 views
11

lời chào tất cả, tôi đang sử dụng bảo mật mùa xuân 3.0.2, urlRewrite 3.1.0 và tôi gặp vấn đề với bảo mật mùa xuân rằng tôi có quy tắc rằng tất cả các trang trong ứng dụng yêu cầu xác thực ngoại trừ một số trang để bảo mật của tôi. xml là:Vấn đề bảo mật mùa xuân với lỗi 404?

<http use-expressions="true" > 
<intercept-url pattern="/" access="permitAll" /> 
<intercept-url pattern="/error" filter="none" /> 
<intercept-url pattern="/**" access="isAuthenticated()" /> 
. 
. 
.</http> 

trong web.xml tôi đã xác định các trang lỗi

<error-page> 
    <error-code>404</error-code> 
    <location>/p/error</location> 
</error-page> 

và vấn đề là nếu tôi không phải là một người dùng đăng nhập, và gõ một số url mà không làm tồn tại trong ứng dụng như app/notFoundUrl bảo mật mùa xuân khớp với trang này với mẫu/** yêu cầu xác thực, vì vậy t người dùng của anh ấy không được chuyển hướng đến trang lỗi như mong đợi, nhưng được chuyển hướng đến trang đăng nhập và sau đó, được chuyển hướng đến trang lỗi

và tôi muốn rằng nếu người dùng gõ url xấu nếu anh ấy đăng nhập hay không, anh ấy được chuyển trực tiếp đến trang lỗi.

tôi nghĩ rằng vấn đề có liên quan đến web.xml, đây là nó:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- Beans in these files will makeup the configuration of the root web application context --> 
    <!-- Bootstraps the root web application context before servlet initialization--> 
    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <!-- Deploys the 'projects' dispatcher servlet whose configuration resides in /WEB-INF/servlet-config.xml--> 
    <servlet> 
     <servlet-name>p</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
      /WEB-INF/servlet-config.xml   
      </param-value> 
     </init-param> 
    </servlet> 

    <!-- Maps all /p URLs to the 'p' servlet --> 
    <servlet-mapping> 
     <servlet-name>p</servlet-name> 
     <url-pattern>/p/*</url-pattern> 
    </servlet-mapping> 

    <error-page> 
    <error-code>404</error-code> 
    <location>/p/error</location> 
    </error-page> 


    <!-- force encoding on the requests --> 
    <filter> 
    <filter-name>encoding-filter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>utf-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    </filter> 
    <filter-mapping> 
    <filter-name>encoding-filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 



    <filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 

    </filter> 
    <filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 





    <!-- Security --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
     /WEB-INF/application-config.xml 
     /WEB-INF/app-security.xml 
     /WEB-INF/mvc-config.xml 
    </param-value> 
    </context-param> 


    <session-config> 
     <session-timeout>1</session-timeout> 
    </session-config> 


</web-app> 

bất kỳ ý tưởng làm thế nào để giải quyết vấn đề này?

Trả lời

6

Bạn đã nói:

tôi muốn rằng nếu người dùng gõ một url xấu nếu anh ấy đăng nhập hay không, anh ấy chuyển đến trang lỗi trực tiếp

an ninh mùa xuân sẽ chặn mọi yêu cầu trước khi nó biết liệu url của nó có hợp lệ hay không, do đó, một cách để có được nó sẽ chặn tất cả các url hợp lệ với một số mẫu và thêm vào cuối mẫu chung có thể được truy cập bởi bất kỳ ai.

<intercept-url pattern="/" access="permitAll" /> 
<intercept-url pattern="/validUrl1Pattern" access="permitAll" /> 
<intercept-url pattern="/validUrl2Pattern" access="permitAll" /> 
<intercept-url pattern="/validUrl2Pattern" access="permitAll" /> 
... 
<intercept-url pattern="/**" access="ROLE_ANONYMOUS" /> 

Vấn đề của cấu hình này có thể khó tìm mẫu cho tất cả các url hợp lệ nếu đơn đăng ký của bạn phức tạp.

+1

"Thực tế là tốt để từ chối truy cập theo mặc định, thay vì chỉ đảm bảo tài nguyên chúng tôi cần". - được trích dẫn từ [Hướng dẫn bảo mật mùa xuân] (http://static.springsource.org/spring-security/site/tutorial.html) –

2

Thêm/lỗi vào danh sách các thành phần <intercept-url/> của bạn để không yêu cầu xác thực để truy cập.

+0

có nghĩa là chỉ cần thêm quy tắc này?

+0

tôi có quyền truy cập bị từ chối ngoại lệ vì trang không tồn tại, khớp với dấu "/ **" sử dụng quy tắc truy cập = "isAuthenticated () "và trong trường hợp người dùng không đăng nhập vai trò là anonyomus để người dùng được chuyển hướng trở lại trang đăng nhập –

+0

bài đăng đã được chỉnh sửa, bất kỳ trợ giúp nào? –

3

khi bạn đặt thuộc tính access="true", bạn cho biết bảo mật mùa xuân để kiểm tra xem người dùng có thuộc tính bảo mật (thường là vai trò) có tên "true" hay không. Tôi không nghĩ đó là mục tiêu của bạn?

để vượt qua bảo mật, bạn có thể thiết lập filters="none" và bỏ qua thuộc tính truy cập: <intercept-url pattern="/errorpage" filters="none" />

thấy documentation of <intercept-url>

3

Yep chỉ cần thêm này:

<intercept-url pattern="/error/**" access="permitAll" /> 

Điều đó sẽ làm cho nó để bất cứ ai có thể truy cập tất cả các trang lỗi của bạn.

+0

bài đăng đã được chỉnh sửa, bất kỳ trợ giúp nào? –

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