2014-10-23 15 views
7

Chúng tôi có một ứng dụng được xây dựng trên Java 1.6 với Spring 3.0.3 sử dụng Spring Security 3.0.5 và triển khai REST API bằng cách sử dụng Spring Web với RestEasy 2.1.0. Tôi cần đặt ứng dụng này (máy chủ) phía sau proxy để chuyển lưu lượng truy vấn HTTPS từ ứng dụng REST API Client sang lưu lượng HTTP. Thay đổi này tạo ra một kịch bản "tên miền chéo" cho yêu cầu đăng nhập: Khách hàng gửi yêu cầu HTTPS để đăng nhập và máy chủ trả lời bằng URL chuyển hướng của HTTP. Hiện nay nó phản ứng với:Làm cách nào để ứng dụng Spring Security chạy sau proxy?

”http://192.168.0.10:8090/index.html;jsessionid=64FD79...86D”,

những gì tôi cần ở đây là:

”/index.html;jsessionid=64FD79...86D”

Chúng tôi đến với giải pháp làm cho máy chủ để đáp ứng với URL “tương đối” thay vì “ URL tuyệt đối ”. Vì vậy, tôi cố gắng thực hiện một cái gì đó tương tự với tình huống được mô tả ở đây:

thread on forum.spring.io

tôi đã thiết lập các đậu RedirectStrategy với contextRelative = "true" và ghi đè lên các setter redirectStrategy từ AbstractAuthenticationTargetUrlRequestHandler trong LoginSuccessHandler mở rộng lớp học của tôi và tôi thấy tài sản redirectStrategy cho đối tượng HttpServletResponse được đặt thành true như mong đợi. Vẫn không giải quyết được vấn đề.

Ngoài ra khi thay đổi sở hữu của redirectURLCC HttpServletResponse đối tượng sử dụng encodeRedirectURL ("otherLogin") là bộ cái gì đó như

”http://192.168.0.10:8090/otherLogin”

và nó không phải những gì tôi cần. Tôi cần xóa toàn bộ giao thức + phần ipaddress của URL. Thuộc tính URL của đối tượng phản hồi không thể truy cập được do thay đổi vì nó được thực thi bởi các giao diện Filter và FilterChain.

Vui lòng đề xuất bất kỳ ý tưởng nào. Tôi cho rằng loại điều này nên được giải quyết trong tệp web.xml hoặc auth-AplicationContext.xml không có trong mã.

Trân trọng.

Trả lời

4

Xuân An sử dụng logic sau khi gửi một chuyển hướng:

public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException { 
    String redirectUrl = calculateRedirectUrl(request.getContextPath(), url); 
    redirectUrl = response.encodeRedirectURL(redirectUrl); 

    if (logger.isDebugEnabled()) { 
     logger.debug("Redirecting to '" + redirectUrl + "'"); 
    } 

    response.sendRedirect(redirectUrl); 
} 

Phương pháp sendRedirect được yêu cầu phải cư xử theo cách sau:

Phương pháp này có thể chấp nhận các URL tương đối; thùng chứa servlet phải chuyển đổi URL tương đối thành URL tuyệt đối trước khi gửi trả lời cho khách hàng.

Điều đó có nghĩa là bạn sẽ bởi người điếc luôn nhận được URL tuyệt đối, bất kể cấu hình hoặc bối cảnh là gì.

Bạn có nhiều lựa chọn:

  • configure container của bạn hoặc máy chủ ứng dụng để được nhận thức của URL công cộng (ví dụ bằng cách sử dụng AJP thay vì reverse proxy HTTP, hoặc đi qua tiêu đề HTTP với địa chỉ URL nào đó là được hỗ trợ bởi một số máy chủ ứng dụng), vd documentation for Tomcat
  • định cấu hình proxy ngược HTTP của bạn để thực hiện viết lại chính xác, ví dụ: thấy ProxyPassReverse trong Apache mod_proxy documentation
  • thực hiện một tùy chỉnh org.springframework.security.web.RedirectStrategy nơi bạn sẽ tự đặt tiêu đề Location phản ứng và HTTP 302 mã trạng thái, điều này sẽ cho phép bạn gửi bối cảnh chuyển hướng tương đối như bạn muốn
1

Không hoàn toàn tương đối, nhưng có lẽ bạn có thể muốn xem xét tùy chọn thứ 4 bằng cách sử dụng org.springframework.web.servlet.view.UrlBasedViewResolver để viết lại URL được chuyển hướng với tên máy chủ bên ngoài của bạn như được mô tả trong câu trả lời này: Override the default redirect URL in a SpringMVC application.

1

Đó nên là đạt được trên Apache với:

ProxyPreserveHost Off 
ProxyPass/http://192.168.0.10:8090 
ProxyPassReverse/http://192.168.0.10:8090 

và thêm một reverse proxy thêm về host proxing với cảng. ví dụ giả tên máy chủ của bạn là proxy.example.com dòng thứ tư sẽ là:

ProxyPassReverse/http://proxy.exemple.com:8090 

Nhìn vào câu trả lời này: Sending redirect in Tomcat web application behind a Apache 2 proxy (mod_proxy)

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