2013-04-19 2 views
9

Ich habe in Active Directory über LDAP erfolgreich verbunden zu authentifizieren, und mit dem folgend in meinem LDAP.xml habe ich meine benutzerdefinierten Behörden Populator genannt:Wie verwende ich einen benutzerdefinierten Behörden-Populator mit Spring Security und dem 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> 

Dies funktioniert gut, und ich kann das Benutzer-ermitteln Genehmigung auf der Grundlage ihrer Gruppenzugehörigkeit, aber ich würde lieber tun dies durch den Einbau-Provider Active Directory LDAP-Authentifizierung:

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

Das Problem mit der oben ist, dass meine Zollbehörden populator ist (natürlich) nicht genannt, so während ich meine Benutzer authentifizieren kann (was mit dem oben genannten funktioniert), ich Ich bin ohne die Gruppen (die ich brauche, um die Genehmigung zu bestimmen).

Ich fühle mich wie dies eine einfache Frage ist, aber für das Leben von mir kann ich hier oder anderswo keine Antwort finden. Muss ich die ActiveDirectoryLdapAuthenticationProvider-Klasse erweitern und von dort aus meinen Behörden-Populator aufrufen?

(Danke für all die Hilfe, die diese Seite mir seit mehreren Jahren gegeben hat; die Wirksamkeit dieser Seite kann daran gemessen werden, dass ich erst kürzlich versucht habe, einen Account zu erstellen, und dies ist meine erste Frage. Vielen dank im Voraus für Ihre Hilfe.)

Antwort

9

Spring ActiveDirectoryLdapAuthenticationProvider Klasse ist final, so meine einzige Option (ich werde bessere unterhalten, wenn es irgendwelche Abnehmer sind) war die Klasse gabeln. Ich kopierte und klebte seinen Inhalt, refaktorierte leicht und entfernte die final Bezeichnung. Dann erstellte ich eine separate Unterklasse der gegabelten Klasse, überschrieb die loadUserAuthorities() Methode und fügte meinen eigenen Code zum Erstellen einer Berechtigungsmaske hinzu.

ich dann in der Lage war meine ldap.xml Datei zu bearbeiten, wie folgt:

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

Für alle anderen n00bs wie ich, sieht die Unterklasse wie folgt aus:

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 
} 

wie ein Charme.

Vielen Dank an zagyi für die Hilfe.