我正在尝试使用我们的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
答案 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也会有所帮助。