2012-02-14 94 views
1

我想配置Apache shiro使用我們的LDAP服務器進行身份驗證。我對LDAP不是很熟悉,請原諒我的無知!Apache shiro LDAP多個OU

使用shiro.ini下列選項工作確定(用戶進行身份驗證):

 
ldapRealm.userDnTemplate = uid={0},ou=users,dc=mycompany,dc=com 

但是我們在我們公司有一個以上的組織單位(OU)。我如何使ou參數具有多個值?我可以使用這個東西嗎

 
ldapRealm.userDnTemplate = uid={0},ou=*,dc=mycompany,dc=com 

我只想嘗試所有組織單位,直到登錄成功。

怎麼樣添加具有不同OU這樣的額外LDAP領域:

 
#ldapRealm1 
ldapRealm1 = org.apache.shiro.realm.ldap.JndiLdapRealm 
ldapRealm1.userDnTemplate = uid={0},ou=users1,dc=mycompany,dc=com 
ldapRealm1.contextFactory.url = ldap://test.com:389 
#ldapRealm2 
ldapRealm2 = org.apache.shiro.realm.ldap.JndiLdapRealm 
ldapRealm2.userDnTemplate = uid={0},ou=users2,dc=mycompany,dc=com 
ldapRealm2.contextFactory.url = ldap://test.com:389 
#ldapRealm3 
ldapRealm3 = org.apache.shiro.realm.ldap.JndiLdapRealm 
ldapRealm3.userDnTemplate = uid={0},ou=users3,dc=mycompany,dc=com 
ldapRealm3.contextFactory.url = ldap://test.com:389 

將這項工作?

還有可能在登錄頁面添加下拉列表以允許用戶選擇其組織單元並將其作爲參數傳遞給ldapRealm?我應該如何繼續?

TIA, Serafeim

回答

1

多個領域將工作得很好。您只需創建一個AuthenticationToken的子接口,該接口還指定您要定向的組織單位。

然後,您可以創建LdapRealm的子類,並更改supports()方法以返回true,IFF AuthenticationToken反映目標組織單位。例如:

LdapAuthenticationToken extends AuthenticationToken { 
    String getOrganizationalUnit(); 
} 

LdapUsernamePasswordToken extends UsernamePasswordToken 
    implements LdapAuthenticationToken { 
    private String organizationalUnit; //add getter/setter 
} 

MyLdapRealm extends LdapRealm { 
    private String organizationalUnit; //add getter/setter 
    @Override 
    public boolean supports(AuthenticationToken token) { 
     return token != null && token instanceof LdapAuthenticationToken && 
      this.organizationalUnit.equals(
       ((LdapAuthenticationToken)token).getOrganizationalUnit()); 
    } 

    @Override 
    protected AuthenticationInfo doGetAuthenticatinoInfo(AuthenticationToken token) { 
     LdapAuthenticationToken ldapToken = (LdapAuthenticationToken)token; 
     //get the OU here, and do whatever you want with it. 
    } 
} 

如果你有一個以上的境界,要知道,每一個可能有這可能不是作爲一個單一的共享連接池高效自己的LDAP連接池。

如果您想擁有一個連接池,則需要使用一個領域並手動制定基於OrganizationalUnit的查詢。在這種情況下,LdapAuthenticationToken也會有所幫助。