2013-04-19 6 views
9

Mam pomyślnie podłączone do usługi Active Directory przez LDAP do uwierzytelniania, a także z następujących w moim ldap.xml Zadzwoniłem moje organy niestandardowe populator:Jak użyć populatora uprawnień niestandardowych przy użyciu Spring Security i 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> 

Działa to dobrze, i mogę ustalić użytkownika autoryzacja w oparciu o jej przynależności do grupy, ale wolałbym to zrobić za pomocą wbudowanego dostawcy uwierzytelniania LDAP Active Directory:

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

problem z powyższego jest to, że moje organy niestandardowe populator jest (oczywiście) nie nazywa, tak podczas gdy mogę uwierzytelniać moich użytkowników (co działa z powyższym), ja pozostało bez grup (które muszę określić autoryzację).

Mam wrażenie, że to proste pytanie, ale nie mogę znaleźć odpowiedzi tutaj ani nigdzie indziej. Czy muszę przedłużyć klasę ActiveDirectoryLdapAuthenticationProvider i wywołać populator mojego organu?

(Dziękuję za całą pomoc, którą ta strona dała mi od kilku lat z rzędu, skuteczność tej strony można ocenić dzięki temu, że dopiero niedawno podjąłem próbę utworzenia konta i jest to moje pierwsze pytanie. Z góry dziękuję za pomoc.)

Odpowiedz

9

Klasa ActiveDirectoryLdapAuthenticationProvider Spring to final, więc moją jedyną prawdziwą opcją (będę lepiej bawić, jeśli są chętni), było rozwidlenie klasy. Skopiowałem i wkleiłem jego zawartość, nieznacznie refaktoryzowałem i usunąłem oznaczenie final. Następnie utworzyłem oddzielną podklasę rozwidlonej klasy, przesłaniając metodę loadUserAuthorities() i dodałem własny kod do budowania maski uprawnień.

byłem wtedy w stanie edytować plik ldap.xml następująco:

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

w żadnym innym n00bs jak ja, podklasa wygląda następująco:

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 
} 

Pracował jak czar.

Bardzo dziękuję za zagyi za pomoc.

Powiązane problemy