2013-05-09 27 views
5

Tôi đã cấu hình Spring Security để xác thực đối với máy chủ LDAP.Xác nhận mùa xuân LdapAuthentication và tải từ cơ sở dữ liệu cục bộ

<security:authentication-manager > 
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 

</security:authentication-manager> 

Sau khi xác thực Tôi muốn tải vai trò từ cơ sở dữ liệu cục bộ cho cùng một người dùng. Làm cách nào để tải vai trò cơ sở dữ liệu cục bộ bằng "ldap-authentication-provider"?

Nếu tôi thêm nhà cung cấp chứng thực thứ hai như sau:

<security:authentication-manager > 
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 
      <security:authentication-provider ref="daoAuthenticationProvider" /> 
</security:authentication-manager> 

daoAuthenticationProvider thêm vào, nhưng mùa xuân không sử dụng các nhà cung cấp thứ hai khi nhà cung cấp auth đầu tiên xác thực người dùng. Chỉ khi nhà cung cấp auth đầu tiên không xác thực nó đi tiếp theo trong danh sách.

Vì vậy, về cơ bản trông giống như chúng ta phải tùy chỉnh

<security:ldap-authentication-provider user-dn-pattern="uid={0}" /> 

để tải vai trò từ cơ sở dữ liệu địa phương.

Mọi đề xuất? Điều này nên được thực hiện như thế nào?

Trả lời

5

Nhà cung cấp xác thực phải cung cấp mã xác thực được điền đầy đủ để xác thực thành công, vì vậy không thể sử dụng một nhà cung cấp để kiểm tra thông tin đăng nhập của người dùng và một nhà cung cấp khác để gán quyền (vai trò) cho nó.

Tuy nhiên, bạn có thể tùy chỉnh nhà cung cấp xác thực ldap để tìm nạp vai trò người dùng từ cơ sở dữ liệu thay vì hành vi mặc định (tìm kiếm nhóm của người dùng trong ldap). LdapAuthenticationProvider có hai chiến lược được tiêm: một chiến lược tự thực hiện xác thực (LdapAuthenticator) và một chiến lược khác tìm nạp quyền của người dùng (LdapAuthoritiesPopulator). Bạn có thể đạt được yêu cầu của mình nếu bạn cung cấp triển khai LdapAuthoritiesPopulator tải vai trò từ cơ sở dữ liệu. Trong trường hợp bạn đã có một UserDetailsService làm việc với cơ sở dữ liệu, bạn có thể dễ dàng tích hợp nó bằng cách gói nó trong một UserDetailsServiceLdapAuthoritiesPopulator và tiêm nó trong LdapAuthenticationProvider.

Vì cấu hình này khá phổ biến, không gian tên xml bảo mật không cung cấp thẻ/thuộc tính để thiết lập, nhưng cấu hình bean thô không quá phức tạp. Đây là đường viền:

1) Tôi cho rằng bạn có một ldap-server ở đâu đó trong cấu hình của mình. Điều quan trọng là chỉ định và id cho nó, điều này sẽ cho phép chúng tôi tham khảo sau này.

<security:ldap-server url="..." id="ldapServer" .../> 

2) Từ phần authentication-manager, bạn sẽ chỉ đề cập đến các nhà cung cấp tùy chỉnh:

<security:authentication-manager> 
    <security:authentication-provider ref="customLdapAuthProvider"/> 
</security:authentication-manager> 

3) Bây giờ, phần thiết yếu:

Các authenticator về cơ bản là giống như cấu hình được tạo bởi cấu hình không gian tên. (Lưu ý thuộc tính contextSource tham chiếu đến máy chủ ldap.)

authoritiesPopulator là một trình bao bọc đơn giản xung quanh việc triển khai userService được định nghĩa ở đâu đó trong cấu hình của bạn.

+0

Đây hoàn toàn là những gì tôi đang tìm kiếm. – user2072797

+0

Có cách nào để thêm userId vào Người dùng không. map empId từ ldap đến thuộc tính userId trong đối tượng User. – user2072797

+0

Câu hỏi này dường như không liên quan đến câu hỏi gốc. Nó có thể tốt hơn nếu bạn cải cách nó và đăng lên như một câu hỏi mới, bởi vì hiện tại chỉ có tôi mới có thể nhìn thấy nó (thực tế), trong khi những người dùng khác có thể cung cấp cho bạn câu trả lời tốt hơn. Dù sao, việc ánh xạ các thuộc tính người dùng từ ldap sang DB là hoàn toàn có thể, nhưng nó không phải là thứ bạn có thể làm với Spring Security. – zagyi

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