2012-02-03 29 views
6

Tôi có ứng dụng web và hai lĩnh vực cho nó - example.com và example.ruLàm cách nào để đăng nhập một lần với bảo mật mùa xuân trên hai tên miền?

example.com - cho quốc tế

example.ru - cho nước sở tại

My ứng dụng web sử dụng bảo mật mùa xuân đối với người dùng ủy quyền nhưng nếu người dùng đăng nhập thông qua example.com trên example.ru anh ấy không đăng nhập.

Làm cách nào để có thể thực hiện điều đó nếu người dùng đăng nhập qua example.com hoặc example.ru, anh ấy sẽ được ghi lại trên cả hai tên miền?

PS: BTW ứng dụng web của tôi sử dụng ủy quyền thông qua OpenID và OAuth

+0

Cơ chế bạn đang tìm kiếm được gọi là đăng nhập một lần. –

+0

Một vấn đề bạn cần phải giải quyết (tôi nghĩ bạn đang thực hiện nó một mình) là id phiên được lưu trữ nhiều nhất trong một cookie. Nhưng trình duyệt chỉ định cookie cho một miền - vì vậy bạn sẽ cần phải xử lý hai sessionIds khác nhau – Ralph

+0

Cách thích hợp để làm điều này là với SSO như Kurt nói. Vì bạn đang sử dụng OpenID và OAuth, bạn cũng có thể giả mạo đăng nhập một lần bằng cách sử dụng HTTPClient để mở trang web khác và sau đó chuyển cookie trở lại cho người dùng. Tôi đã phải làm điều này trong các môi trường mà chúng ta trộn lẫn Acegi cũ và các ứng dụng Spring Security mới hơn. Nó không đẹp, cũng không phải là điều đúng đắn để làm, nhưng nó nhanh chóng và hoàn thành công việc. – Joe

Trả lời

2

Như đã đề cập bạn cần một dấu hiệu duy nhất về giải pháp, Cloudseal cung cấp một phần mở rộng an ninh mùa xuân trong đó bao gồm một không gian tên mùa xuân vì vậy bạn chỉ cần làm một cái gì đó như:

<security:http entry-point-ref="cloudseal"> 
    <security:intercept-url pattern="/protected/user.do" access="IS_AUTHENTICATED_FULLY" /> 
    <security:intercept-url pattern="/protected/admin.do" access="ROLE_ADMIN" /> 
</security:http> 

<cloudseal:sso endpoint="http://cloudseal.com" entry-point-id="cloudseal" app-id="quickstart"> 
    <cloudseal:keystore location="WEB-INF/keystore.jks" password="nalle123"> 
     <cloudseal:key name="apollo" password="nalle123" /> 
    </cloudseal:keystore> 
    <cloudseal:metadata location="WEB-INF/idp.xml" /> 
</cloudseal:sso> 

Xem www.cloudseal.com/platform/spring-security-single-sign-on

0

Không thể sửa đổi mã bảo mật mùa xuân. Tôi đã làm điều đó đôi khi trước đây nhưng rất khó để bảo trì

Cas là cách dễ dàng nhất trong thế giới java này. http://www.jasig.org/cas

1

Trong khi loại chức năng này là do không có nghĩa là tầm thường để đạt được, nó là trong thực tế có thể mà không cần sửa đổi mùa xuân.

Mã thực tế quá lớn để đăng, vì vậy tôi sẽ cố gắng phác thảo nguyên tắc cơ bản và để mã hóa cho bạn.

  1. Mở rộng Spring SavedRequestAwareAuthenticationSuccessHandler và thực hiện các chức năng để serialize và viết đối tượng Authentication cho một cookie phiên với một phạm vi toàn cầu. Xem tài liệu cho thuộc tính authentication-success-handler-ref trong thẻ <sec:http> của mùa xuân để biết thêm thông tin về cách dây tính năng này. (Lưu ý: Nếu sự cố xảy ra trên nhiều ứng dụng web trên cùng một tên miền, bạn có thể giới hạn phạm vi cookie cho tên miền hiện tại ).
  2. Trong tất cả các ứng dụng web của bạn, thêm vào web.xml một <filter> nét tên springSecurityFilterChain và lớp org.springframework.web.filter.DelegatingFilterProxy<filter-mapping> cho bộ lọc với một mẫu URL của /* Bạn không cần phải tạo ra các hạt thực tế, Spring Security cung cấp một thực hiện mặc định cho bạn.
  3. Trong tất cả các ứng dụng web của bạn, thêm vào web.xml một <filter> nét tên singleSignonAuthenticationFilterChain với lớp org.springframework.web.filter.DelegatingFilterProxy và tương ứng <filter-mapping> cho bộ lọc với một mẫu URL của /*
  4. Bây giờ bạn thêm một bean mới gọi là singleSignonAuthenticationFilterChain, sẽ trỏ đến lớp mà implements Filter.Trong phương thức doFilter(), hãy kiểm tra xem có thuộc tính phiên được gọi là SPRING_SECURITY_CONTEXT hay không. Nếu có , thì chúng tôi đã đăng nhập. Nếu không, hãy lấy mã số được mã hóa Authentication được tuần tự hóa, deserialize và sử dụng SecurityContextHolder.getContext().setAuthentication(authentication) để xác thực người dùng bằng Spring. Đồng thời, hãy nhớ đến session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext()) hoặc xác thực sẽ mất đặt mỗi lần, điều này là không cần thiết.

Biến thành (4) là nếu bạn phát hiện ra rằng không có thuộc tính được gọi là SPRING_SECURITY_CONTEXT thì có thể do người dùng vừa đăng xuất khỏi ứng dụng web hiện tại. Trong trường hợp này, anh ta phải đăng xuất toàn cục, vì vậy bạn muốn xóa cookie chứa mã thông báo xác thực được tuần tự hóa trong trường hợp này.

Đó là loại phức tạp để viết lên trong một bản tóm tắt một trang, nhưng tôi hy vọng bạn sẽ có được ý tưởng chung. Chúng tôi hiện đã thực hiện điều này trong một ứng dụng phức tạp bao gồm nhiều ứng dụng web và nó hoạt động độc đáo.

+0

Bạn có thể xây dựng, đặc biệt là các bước 1 và 4 không? Tôi đã thử điều này nhưng không thể có được chiến tranh 2 để xem cookie từ chiến tranh 1 – blong824

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