1

LDAPサーバーを使用して認証するようにapacheshiroを構成しようとしています。私はLDAPにあまり詳しくないので、無知を許してください。

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、セラフェイム

4

1 に答える 1

1

複数のレルムで問題なく動作します。対象とする組織単位も指定するAuthenticationTokenのサブインターフェースを作成する必要があります。

次に、LdapRealmのサブクラスを作成し、supports()メソッドを変更して、AuthenticationTokenが対象の組織単位を反映する真のIFFを返すようにします。例えば:

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接続プールがあり、単一の共有接続プールほど効率的ではない可能性があることに注意してください。

単一の接続プールが必要な場合は、1つのレルムを使用し、OrganizationalUnitに基づいて手動でクエリを作成する必要があります。この場合も、LdapAuthenticationTokenが役立ちます。

于 2012-02-15T19:23:02.893 に答える