2013-04-19 6 views
9

Ho collegato con successo ad Active Directory tramite LDAP per l'autenticazione, e con il seguente nel mio ldap.xml Ho chiamato i miei autorità doganali Populator:Come utilizzare un popolamento delle autorità personalizzate con Spring Security e 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> 

Questo funziona bene, e posso accertare l'utente del autorizzazione basato sulla sua appartenenza a un gruppo, ma avrei preferito fare questo attraverso il provider di autenticazione LDAP di Active Directory integrato:

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

il problema con quanto sopra è che i miei autorità doganali Populator è (ovviamente) non convocati, così mentre posso autenticare i miei utenti (che funzionano con quanto sopra), I sono rimasto senza i gruppi (che ho bisogno di determinare l'autorizzazione).

Mi sento come se fosse una domanda semplice, ma per la vita di me non riesco a trovare una risposta qui o altrove. Devo estendere la classe ActiveDirectoryLdapAuthenticationProvider e chiamare da lì il mio authority delle autorità?

(Grazie per tutto l'aiuto che mi ha dato questo sito per diversi anni, l'efficacia di questo sito può essere valutata dal fatto che mi sono preso la briga di creare solo un account, e questa è la mia prima domanda. Grazie in anticipo per il vostro aiuto.)

risposta

9

Spring ActiveDirectoryLdapAuthenticationProvider class è final, quindi la mia unica opzione reale (ne intratterrò di migliori se ci sono alcuni acquirenti) è stata quella di sborsare la classe. Ho copiato e incollato il suo contenuto, leggermente refactored, e rimosso la designazione final. Quindi, ho creato una sottoclasse separata della classe biforcuta, sovrascrivendo il metodo loadUserAuthorities() e aggiunto il mio codice personale per la creazione di una maschera di autorizzazioni.

sono stato poi in grado di modificare il mio file ldap.xml come segue:

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

Per qualsiasi altra n00bs come me, la sottoclasse è simile al seguente:

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 
} 

funzionato come un fascino.

Mille grazie a zagyi per l'assistenza.