11

認証のために LDAP を介して Active Directory に正常に接続し、ldap.xml で以下を使用して、カスタム機関ポピュレーターを呼び出しました。

    <bean id="ldapAuthenticationProvider"
        class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <constructor-arg ref="ldapBindAuthenticator"/>
    <constructor-arg ref="ldapAuthoritiesPopulator"/>
</bean>

<bean id="ldapBindAuthenticator"
        class="org.springframework.security.ldap.authentication.BindAuthenticator">
    <constructor-arg ref="ldapServer"/>
    <property name="userSearch" ref="ldapSearch"/>
</bean>

<bean id="ldapSearch"
        class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <constructor-arg value="CN=Users"/>
    <constructor-arg value="(sAMAccountName={0})"/>
    <constructor-arg ref="ldapServer"/>
</bean>

<bean id="ldapAuthoritiesPopulator"
        class="my.project.package.ActiveDirectoryLdapAuthoritiesPopulator"/>

<bean id="ldapServer"
        class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldap://192.168.0.2/dc=test,dc=server"/>

    <property name="userDn" value="ldap@test.server"/>
    <property name="password" value="ldap"/>
    <property name="baseEnvironmentProperties">
        <map>
            <entry key="java.naming.referral">
                <value>follow</value>
            </entry>
        </map>
    </property>
</bean>

これは正常に機能し、ユーザーのグループ メンバーシップに基づいてユーザーの承認を確認できますが、組み込みの Active Directory LDAP 認証プロバイダーを使用してこれを行うことをお勧めします。

<bean id="ldapAuthenticationProvider"
        class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">

        <constructor-arg value="test.server"/>
        <constructor-arg value="ldap://192.168.0.2:389"/>
        <property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

上記の問題は、カスタム権限ポピュレーターが (明らかに) 呼び出されないことです。そのため、ユーザーを認証することはできますが (これは上記で動作します)、グループ (承認を決定する必要があります) がありません。

これは簡単な質問だと思いますが、私の人生では、ここでも他の場所でも答えを見つけることができません. ActiveDirectoryLdapAuthenticationProvider クラスを拡張し、そこから権限ポピュレータを呼び出す必要がありますか?

(このサイトが何年にもわたって私に与えてくれたすべての助けに感謝します。このサイトの有効性は、私が最近になってアカウントを作成しようとしたという事実によって測ることができます。これが私の最初の質問です。よろしくお願いします。あなたの助け。)

4

1 に答える 1

10

Spring の ActiveDirectoryLdapAuthenticationProvider クラスはfinal. その内容をコピーして貼り付け、少しリファクタリングし、final指定を削除しました。次に、分岐したクラスの別のサブクラスを作成してloadUserAuthorities()メソッドをオーバーライドし、アクセス許可マスクを作成するための独自のコードを追加しました。

ldap.xmlその後、次のようにファイルを編集できました。

    <bean id="ldapAuthenticationProvider"
            class="my.project.package.OverrideActiveDirectoryLdapAuthenticationProvider">   
        <constructor-arg value="test.server"/>
        <constructor-arg value="ldap://192.168.0.2:389"/>
        <property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

私のような他の n00bs の場合、サブクラスは次のようになります。

public class OverrideActiveDirectoryLdapAuthenticationProvider extends TestActiveDirectoryLdapAuthenticationProvider {

//my assignments

public OverrideActiveDirectoryLdapAuthenticationProvider(String domain,
        String url) {
    super(domain, url);
}

@Override
protected Collection<? extends GrantedAuthority> loadUserAuthorities(DirContextOperations userData, String username, String password) {
//original code with my own additions
//in my case, I injected code into the for(group : groups) loop
}

魅力のように働きました。

支援してくれたzagyiに感謝します。

于 2013-04-20T18:15:59.673 に答える