2013-04-19 32 views
9

は、私が正常に認証するためにLDAPを介してActive Directoryに接続している、と私ldap.xmlに次に私は私のカスタム当局は、ポピュレータと呼ばました:Spring SecurityとActiveDirectoryLdapAuthenticationProviderでカスタム権限ポピュレータを使用するにはどうすればいいですか?

<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="[email protected]"/> 
    <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クラスを拡張し、そこから私の当局のpopulatorを呼び出す必要がありますか?

(このサイトが何年にも渡って私に与えてくれたおかげで、このサイトの有効性は、最近アカウントを作成することに悩まされたという事実によって分かります。

答えて

9

春のActiveDirectoryLdapAuthenticationProviderクラスはfinalなので、私の唯一の本当の選択肢(受講者があれば、より良いものを楽しめるでしょう)はクラスをフォークすることでした。その内容をコピーして貼り付け、わずかにリファクタリングしてfinalという指定を削除しました。次に、loadUserAuthorities()メソッドをオーバーライドしてフォークされたクラスの別のサブクラスを作成し、アクセス許可マスクを構築するための独自のコードを追加しました。

私は、次のように私のldap.xmlファイルを編集することができました。私のような他のn00bsについては

<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> 

、サブクラスは次のようになります。

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さんにお世話になりました。

関連する問題