2012-02-14 1 views
1

Я пытаюсь настроить apache для аутентификации с использованием нашего LDAP-сервера. Я не очень хорошо знаком с LDAP, поэтому простите мое невежество, пожалуйста!Apache shiro LDAP multiple OUs

Используя следующий параметр в 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? Как мне следует продолжить это?

ТИА, Serafeim

ответ

1

Многопользовательские области будет работать нормально. Вам просто нужно создать под-интерфейс AuthenticationToken, который также определяет, какой организационный блок вы планируете.

Затем вы можете создать подкласс LdapRealm и изменить метод поддержки() для возврата истинного IFF. АутентификацияToken отражает целевой организационный блок. Например:

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 также будет полезен в этом случае.

 Смежные вопросы

  • Нет связанных вопросов^_^