2012-04-30 15 views
31

Tôi có ứng dụng web Spring, được bảo mật bằng Spring Security, chạy trên EC2. Ở phía trước của trường hợp EC2 là một bộ cân bằng tải đàn hồi với một chứng chỉ SSL (https kết thúc tại tải cân bằng tức là cổng 443 -> cổng 80), do đó, từ quan điểm của Tomcat, các yêu cầu gửi đến là HTTP.Đăng nhập HTTPS với Spring Security chuyển hướng đến HTTP

Biểu mẫu đăng nhập của tôi gửi tới https, tuy nhiên chuyển hướng tiếp theo chuyển đến http (thành công hoặc không thành công). Việc xác thực đã thành công, và tôi có thể quay về https và tôi đang đăng nhập

cấu hình đăng nhập của tôi trông giống như vậy:.

<security:form-login 
    default-target-url="/home" 
    login-page="/" 
    login-processing-url="/processlogin" 
    authentication-failure-url="/?login_error=1"/> 

gì tôi cần phải thay đổi để làm mặc định mục tiêu-url và xác thực-lỗi-url đi đến https?

  • Tomcat 6
  • Xuân An 3.0.x
+0

Tôi đã thiết lập một Apache viết lại trong thời gian có nghĩa, nhưng vẫn tò mò nếu có một cách để làm với trong cấu hình Spring Security. – Thody

+0

thường được thực hiện tại cân bằng tải và cấu hình được gọi là url-viết lại. Bằng cách này cân bằng tải đảm bảo rằng chuyển hướng vẫn ở https. – Ritesh

Trả lời

1

Một cách tôi đã làm việc này là bằng cách thêm các cấu hình sau

<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" > 
    <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" /> 
    <logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" /> 
    ... 
</http> 

Đã thêm always-use-default-target="true"default-target-url="https://....". Không phải là cách lý tưởng vì bạn cần phải mã cứng url trong cấu hình.

0

Tôi đặt yêu cầu-channel = "any" trên tất cả các url chặn. Điều này cho phép nó vẫn hoạt động trong môi trường dev của tôi, nơi tôi không sử dụng SSL.

<intercept-url pattern="/createUser" access="permitAll" requires-channel="any"/> 
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/> 
<intercept-url pattern="/**" access="isAuthenticated()" requires-channel="any"/> 

Sau đó, tạo máy chủ ảo apache chuyển hướng tất cả lưu lượng truy cập đến phiên bản HTTPS.

<VirtualHost *:80> 
    ServerName www.mywebsite.com 
    Redirect permanent/https://www.mywebsite.com/ 
</VirtualHost> 
+5

Sau khi đăng nhập, Spring sẽ vẫn gửi tiêu đề Vị trí với địa chỉ http. Người dùng sẽ không nhận thấy, bởi vì apache của bạn sẽ ngay lập tức chuyển hướng anh ta đến https một lần nữa, nhưng nó vẫn là một vấn đề an ninh nghiêm trọng, bởi vì trình duyệt sẽ gửi cookie phiên qua một kênh không an toàn. – marcelj

+0

@marcelj - Tôi chỉ chạy nó qua firebug và bạn đã đúng. Tôi sẽ cố gắng tìm ra giải pháp tốt hơn và sửa lại câu trả lời của tôi nếu tôi làm. –

+0

@marcelj, Bạn có thể giải thích tại sao đây là một nguy cơ bảo mật nghiêm trọng hoặc cung cấp một tham chiếu mô tả rủi ro? –

19

Cấu hình lò xo của bạn nên bất khả tri với giao thức đã sử dụng. Nếu bạn sử dụng một cái gì đó như "yêu cầu-kênh", bạn sẽ chạy vào các vấn đề sớm hay muộn, đặc biệt là nếu bạn muốn triển khai cùng một ứng dụng cho một môi trường phát triển mà không có https.

Thay vào đó, hãy xem xét định cấu hình tomcat của bạn đúng cách. Bạn có thể làm điều này với RemoteIpValve. Tùy thuộc vào tiêu đề các loadbalancer gửi, cấu hình server.xml của bạn cần phải chứa một cái gì đó như thế này:

<Valve 
    className="org.apache.catalina.valves.RemoteIpValve" 
    internalProxies=".*" 
    protocolHeader="X-Forwarded-Proto" 
    httpsServerPort="443" 
    /> 

mùa xuân sẽ xác định địa chỉ chuyển hướng tuyệt đối dựa trên ServletRequest, vì vậy thay đổi httpsServerPort nếu bạn đang sử dụng một cái gì đó khác hơn 443:

các httpsServerPort là cổng được trả về bởi ServletRequest.getServerPort() khi protocolHeader chỉ https giao thức

0

Tôi cũng phải đối mặt chính xác cùng một vấn đề và cho đến khi tôi nhận được giải pháp thích hợp tôi đang chuyển hướng các yêu cầu của tôi từ máy chủ proxy đến máy chủ tomcat qua AJP thay vì HTTP. Dưới đây là cấu hình apache của tôi

ProxyPass /myproject ajp://localhost:8009/myproject 
ProxyPassReverse /myproject ajp://localhost:8009/myproject 
0

sử dụng các dòng mã dưới đây trong web.xml

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>Login and Restricted Space URLs</web-resource-name> 
    <url-pattern>/j_security_check</url-pattern> 
    <url-pattern>/loginpage.rose</url-pattern> 
    </web-resource-collection> 
    <user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

nó buộc phải sử dụng HTTPS.