2012-02-14 60 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也会有所帮助。