2012-01-10 22 views
5

Tôi đang cố gắng để có được mùa xuân + hibernate + spring-security và tiles2 - "HelloWorld" ứng dụng để làm việc, sau this guide (của nó ở Đức không may).j_spring_security_check 404 issue

Vấn đề của tôi là tôi nhận được thông báo lỗi "404" khi đăng nhập vào ứng dụng của mình. Chuyển hướng đến trang đăng nhập hoạt động như dự định, nhưng tôi không thể truy cập "http://localhost:8080/App/j_spring_security_check" khi tôi nhấn nút đăng nhập.

web.xml của tôi trông như thế này:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/defs/applicationContext.xml 
     /WEB-INF/defs/applicationContext-security.xml 
    </param-value> 
</context-param> 

<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> 

<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 

và applicationContext-security.xml tập tin trông theo cách này ...

<http use-expressions="true"> 
    <intercept-url pattern="/index.html" access="permitAll" /> 
    <intercept-url pattern="/timeout.html" access="permitAll" /> 
    <intercept-url pattern="/redirect.html" access="permitAll" /> 
    <intercept-url pattern="/media/**" access="permitAll" /> 
    <intercept-url pattern="/includes/**" access="permitAll" /> 
    <intercept-url pattern="/office/**" access="hasRole('ROLE_USER')" /> 
    <intercept-url pattern="/office/admin/**" access="hasRole('ROLE_ADMIN')" /> 

    <form-login login-page="/index.html" 
      authentication-failure-url="/index.html?login_error=1" 
      default-target-url='/office/kunden.html' 
      always-use-default-target='true' 
      /> 
    <logout logout-success-url="/index.html" /> 
    <remember-me /> 
    <session-management invalid-session-url="/index.html"> 
     <concurrency-control max-sessions="2" error-if-maximum-exceeded="true" /> 
    </session-management> 
</http> 

<authentication-manager> 
    <authentication-provider> 
     <jdbc-user-service data-source-ref="mysqldataSource" 
        authorities-by-username-query="select username, authority from benutzer where username = ?" 
        users-by-username-query="select username, password, enabled from benutzer where username = ?"/> 
    </authentication-provider> 
</authentication-manager> 

Kết nối cơ sở dữ liệu có vẻ là O.K.

Tôi sẽ rất vui mừng nếu ai đó có thể cho tôi một gợi ý về điều đó, bởi vì tôi đã làm rất nhiều googling, nhưng không tìm thấy một giải pháp nào được nêu ra.

Tôi sử dụng spring 3.1 và tomcat 7.0.23

+0

Bạn có nghĩa là "j_security_check" hoặc "j_spring_security_check" không? Bạn có cả hai ở đây ... –

+0

Xin lỗi, đó là j_spring_security_check – xSNRG

+0

Kiểm tra kết xuất nhật ký gỡ lỗi cho yêu cầu đó và xem những gì Spring Security nói về việc xử lý nó. Bạn sẽ thấy một báo cáo chi tiết về đoạn văn của nó thông qua chuỗi bộ lọc. –

Trả lời

0

Cấu hình của bạn có vẻ ổn. Một điều có thể xảy ra với 404 là nếu default-target-url='/office/kunden.html' trỏ tới bộ điều khiển hoặc chế độ xem không tồn tại.

Kiểm tra xem url /office/kunden.html có hoạt động hay không - do đó hãy hủy kích hoạt công cụ bảo mật (chỉ cần thêm <security:intercept-url pattern="/**" access="permitAll" />) và dùng thử.

Một thứ khác có thể sai, là hướng dẫn dành cho mùa xuân 3.0 nhưng không phải là mùa xuân 3.0. Tôi không nghĩ rằng đây là nguyên nhân, nhưng hãy thử và hạ cấp.

+0

Đó là những gì tôi đã làm trước, tắt các hạn chế bảo mật. Cùng một vấn đề. Có lẽ bạn đang đúng và hạ cấp giúp. – xSNRG

+0

Bạn có thể làm rõ chính xác yêu cầu nào gây ra 404 không? Bạn có thể làm việc đó từ nhật ký và bằng cách theo dõi các yêu cầu được gửi bởi trình duyệt của bạn (ví dụ: sử dụng Firebug). –

+0

@ xSNRG: Nếu vấn đề tương tự xảy ra với việc bật bảo mật mùa xuân thì vấn đề có liên quan đến bộ điều khiển hoặc chế độ xem 'kunden'. - Bạn đã thực hiện các tutor để kết thúc của nó, bởi vì nó trông giống như bộ điều khiển 'kunden' được thực hiện sau khi các công cụ bảo mật? – Ralph

2

tôi sẽ kiểm tra hai điều:

  1. Yêu cầu văn
  2. mùa xuân-an ninh cấu hình

Để kiểm tra yêu cầu công văn chỉ chắc chắn rằng ứng dụng của bạn có thể truy cập trong container servlet trong nơi đầu tiên. Có nghĩa là, bạn đã đề cập đến http://localhost:8080/App/j_spring_security_check. Ứng dụng của bạn có thể truy cập theo URL đó không? http://localhost:8080/App có hiển thị nội dung phù hợp (HTTP 200) không? Đồng thời đảm bảo rằng bộ điều phối servlet được cấu hình đúng cách. Trong hướng dẫn bạn đã cung cấp, có phần này:

<!-- Spring Hauptteil --> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

Nếu bạn chưa cung cấp trong web.xml, yêu cầu của bạn có thể không được gửi đi đúng trước khi kết thúc kiểm tra thông qua bảo mật mùa xuân.

Nếu điều này không giúp bạn, hãy thử điều này.

Sau documentation, cấu hình tối thiểu phải đủ để kiểm tra xem thiết lập của bạn có chính xác hay không. Nếu bạn đã làm theo hướng dẫn, bạn có thể làm cho một số sai lầm nhỏ (ví dụ như typeo) mà sẽ gây ra mùa xuân bảo mật không để khởi động đúng cách. Sau đó, nó rất dễ dàng để bỏ qua một số thông tin lỗi trong đầu ra logger. Tôi khuyên bạn nên làm như sau.

  1. Thay đổi ứng dụng của bạnContext-security.xml để hỗ trợ cấu hình tối thiểu được cung cấp trong tài liệu.
  2. Khởi chạy ứng dụng và đi đến http://localhost:8080/App/j_spring_security_check

Nếu bạn nhận được câu trả lời đúng đắn - hãy thử thay đổi cấu hình cho đến khi bạn đã làm xong.

Điểm cần tìm hiểu Điều gì DelegatingFilterProxy (được định nghĩa trong web.xml) thực sự là yêu cầu ủy quyền cho một số bộ lọc khác do Spring's IoC quản lý. Bộ lọc này đang được xác định trong applicationContext-security thông qua không gian tên bảo mật. Nếu điều này không hoạt động vì một lý do nào đó, bộ lọc sẽ không được khởi tạo và bạn có thể sẽ thấy http 404 bất kể thực tế, phần còn lại của ứng dụng bắt đầu đúng cách.

Uffff, rất nhiều văn bản;)

0

Đối với những người đối mặt với những triệu chứng tương tự, nhưng đối với một tình huống khác nhau, những người đằng sau một cân bằng tải mà không SSL giảm tải, câu trả lời sau đây có thể đưa bạn vào đúng hướng. Tôi gặp vấn đề tương tự và hóa ra yêu cầu gửi đến đã được xử lý đúng, tuy nhiên khi bảo mật lò xo phản hồi gửi chuyển hướng tới URL tuyệt đối được xác định bởi thuộc tính default-target-url (bắt đầu bằng http thay vì https)

<security:form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true" /> 

Bây giờ trình duyệt client cố gắng để mở vị trí chuyển hướng trên http, thất bại trên loadbalancer (mà chỉ nhận https giao thông) và báo cáo một 404 NOT FOUND

Chúng tôi giải quyết vấn đề này bằng cách thêm mod_header chỉ thị sau cho tất cả các yêu cầu đến trên cổng 443 (https) trong bộ cân bằng tải:

RequestHeader set X-Forwarded-Proto "https"

Sẽ thêm tiêu đề bổ sung. Nếu bạn chạy một máy chủ ứng dụng như Jetty, nó sẽ nhận ra tiêu đề này và dịch yêu cầu đến. (xem http://www.gossamer-threads.com/lists/apache/users/407272)