Apache shiro LDAP несколько OU - PullRequest
       24

Apache shiro LDAP несколько OU

1 голос
/ 14 февраля 2012

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

Использование следующего параметра в shiro.ini работает нормально (аутентификация пользователей):

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

Однако в нашей компании имеется более одной организационной единицы. Как сделать так, чтобы параметр ou принимал несколько значений? Могу ли я использовать что-то это

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

Я просто хочу попробовать все организационные единицы, пока вход не будет успешным.

Как насчет добавления дополнительных областей ldap, имеющих другое ou, как это:

#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 Ответ

1 голос
/ 15 февраля 2012

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

Затем вы можете создать подкласс LdapRealm и изменить метод support (), чтобы он возвращал 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 также будет полезен в этом случае.

...