Apache shiro LDAP多个OU

时间:2012-02-14 08:16:46

标签: java ldap shiro

我正在尝试使用我们的LDAP服务器配置apache shiro进行身份验证。我对LDAP不太熟悉,请原谅我的无知!

在shiro.ini中使用以下选项正常工作(用户已通过身份验证):

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

但是我们公司有多个组织单位(ou)。如何使ou参数采用多个值?我可以使用这个

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

我只想尝试所有组织单位,直到登录成功。

如何添加具有不同的额外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 个答案:

答案 0 :(得分: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也会有所帮助。