2012-07-04 30 views
5

Tôi đang gặp sự cố để tìm cách liên kết người dùng #Ldap với một nhóm nhất định.Liên kết người dùng Ldap với một nhóm với Java

Đó là những gì tôi đã cố gắng:

Attributes attrs = new BasicAttributes(); 

    BasicAttribute basicAttrs = new BasicAttribute("objectclass"); 
    basicAttrs.add("top"); 
    basicAttrs.add("person"); 

    BasicAttribute memberOf = new BasicAttribute("memberOf"); 
    memberOf.add("Managers"); // Tried with distinguished name too 
    memberOf.add("Administrators"); // Tried with distinguished name too 

    attrs.put(basicAttrs); 
    attrs.put("cn", user.getLogin()); 
    attrs.put("name", user.getLogin()); 
    attrs.put("login", user.getLogin()); 
    attrs.put("mail", user.getMail()); 
    attrs.put("displayName", user.getDisplayName()); 
    attrs.put("memberOf", memberOf); 

    try { 
     ctx.bind("CN=" + user.getLogin() + "," + baseDn, null, attrs); 
    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Tôi cũng cố gắng sử dụng các tên phân biệt như: "CN = quản lý, OU = < system_name>, OU = Users, OU = < server>, DC = com ", nhưng không hoạt động. Tôi nghĩ nó nên ở đâu đó để tham khảo nhóm Ldap.

Nhưng tôi đã nhận lỗi này:

javax.naming.directory.InvalidAttributeValueException: Malformed 'memberOf' attribute value; remaining name 'CN=lcarvalho,OU=<system_name>,OU=Users,OU=<server>,DC=com' 
at com.sun.jndi.ldap.LdapClient.encodeAttribute(LdapClient.java:951) 
at com.sun.jndi.ldap.LdapClient.add(LdapClient.java:999) 
at com.sun.jndi.ldap.LdapCtx.c_bind(LdapCtx.java:396) 
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_bind(ComponentDirContext.java:277) 
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:197) 
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:186) 
at javax.naming.directory.InitialDirContext.bind(InitialDirContext.java:158) 
... 

Đây là tất cả các vết đống bên cạnh dòng ứng dụng của tôi.

+0

Tôi chưa sử dụng JNDI để làm việc với LDAP, nhưng bạn đã kiểm tra trong Máy chủ LDAP chưa, nếu lớp đối tượng 'person' có thuộc tính 'memberOf' chưa? Máy chủ LDAP mà bạn đang phát triển chống lại là gì? Trong mọi trường hợp, bạn phải chỉ định DN đầy đủ cho 'memberOf'. – hovanessyan

+0

Tôi đã thử ngay bây giờ chỉ vì mục đích thử nghiệm điều này và có thể tái tạo vấn đề. Thuộc tính 'memberOf' không tồn tại và DN là chính xác. Nhưng tôi nghĩ rằng vấn đề chính ở đây là việc thêm một người dùng vào một nhóm sẽ xảy ra từ đối tượng nhóm, không phải đối tượng người dùng (như @EJP đã nhận xét thêm bên dưới). –

Trả lời

0

lẽ Hầu hết các DN của bạn là sai, vì có vẻ như bạn đã chỉ định thêm một Organizational Unit thay vì Component miền:

"CN=Managers,OU=<system_name>,OU=Users,OU=<server>,DC=com" 

nên là:

"cn=Managers,ou=<system_name>,ou=Users,dc=<server>,dc=com" 

Trong LDAP cấu trúc thư mục bắt đầu với 2 thành phần tên miền, là tên miền công ty được đảo ngược (theo quy ước).

Để cho mã của bạn để làm việc, bạn phải đưa vào tài khoản như sau:

  • có một schema "Người" đó là nạp trong máy chủ LDAP của bạn

  • có một thuộc tính "memberOf "quy định tại của bạn "Person" schema

  • "memberOf" đòi hỏi đầy đủ DN như entry

Tôi cũng khuyến khích bạn xem UnboundID LDAP SDK.

Hy vọng điều đó sẽ hữu ích.

0

Giá trị của thuộc tính memberOf là sai. Thuộc tính memberOf có thể là một tên phân biệt. Máy khách LDAP nên tham khảo lược đồ (DN cơ sở có thể có sẵn trong root DSE) khi nghi ngờ về cú pháp, thứ tự hoặc quy tắc khớp của thuộc tính.

+0

Cảm ơn bạn nhưng tôi cũng đã cố gắng sử dụng tên phân biệt, tôi bỏ qua baseDn, nhưng ở đây là: 'Chuỗi baseDn =" OU = Delphos, OU = Người dùng, OU = Nextel, DC = tades, DC = com, DC = br "'; Và đây là cả hai tên phân biệt tôi đang sử dụng: 'memberOf.add (" CN = Gestores, OU = Delphos, OU = Vai trò, OU = Tiếp theo, DC = tades, DC = com, DC = br "); memberOf.add ("CN = Administradores, OU = Delphos, OU = Vai trò, OU = Tiếp theo, DC = tades, DC = com, DC = br"); ' Tôi có các lược đồ Vai trò và Người dùng được tạo trong máy chủ Ldap . Tôi cũng có thuộc tính "memberOf" được tạo ra, khi tôi cố gắng bỏ qua nó, lỗi sẽ thay đổi thành 'Lỗi trong hoạt động chuyển đổi thuộc tính, dữ liệu 0, v1db1' –

3

Nếu bạn đang sử dụng OpenLDAP, thuộc tính memberOf được duy trì tự động bởi lớp phủ memberOf và ứng dụng của bạn không được viết hoàn toàn. Những gì bạn cần làm là thêm DN của người dùng vào thuộc tính uniqueMember hoặc roleOccupant etc của nhóm mà anh ta đang tham gia. Sau đó, DN của nó sẽ xuất hiện một cách kỳ diệu trong thuộc tính memberOf của anh ta.

+1

Câu trả lời này là chính xác và phải được đánh dấu như vậy. Nó cũng được xác nhận bởi câu trả lời cho câu hỏi rất giống nhau này: http://stackoverflow.com/questions/21147625/java-ldap-add-group-to-user-issue-error-code-53-will-not-perform –

-1

Tôi đã gặp vấn đề tương tự. Kiểm tra kiểu giá trị của thuộc tính này bằng cách sử dụng bất kỳ ứng dụng khách nào của ldap (ví dụ: Apache Directory Studio). Nếu bạn cố gắng thay thế thuộc tính mà loại là String với giá trị int nó sẽ ném lỗi này.

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