2013-04-19 17 views
9

başarıyla kimlik doğrulaması için LDAP aracılığıyla Active Directory bağladığınız ve benim ldap.xml aşağıdaki ile benim özel yetkililer Populator aradım:Spring Güvenlik ve ActiveDirectoryLdapAuthenticationProvider ile özel bir yetkililer popülatörünü nasıl kullanırım?

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

Bu iyi çalışır, ben de kullanıcının tespit edebilirsiniz yetkilendirme onun grup üyeliklerine göre, ama yerine yerleşik Active Directory LDAP Kimlik Doğrulama Sağlayıcısı ile bu yapacağını: böylece,

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

yukarıdaki ile sorun benim özel yetkililer Populator (besbelli) 'dir aramadı olmasıdır Kullanıcılarımı doğrulayabilirim (yukarıdakilerle çalışır), Gruplar olmadan ayrıldım (bu yetkisini belirlemem gerekiyor).

Bunun basit bir soru olduğunu hissediyorum, ama hayatım boyunca burada veya başka bir yerde bir cevap bulamıyorum. ActiveDirectoryLdapAuthenticationProvider sınıfını genişletmeli ve oradan yetkililer popülatörümü çağırmalı mıyım?

(Bu sitenin bana birkaç yıl boyunca vermiş olduğu tüm yardımlar için teşekkürler, bu sitenin etkinliği sadece yakın zamanda bir hesap oluşturmaktan rahatsız olduğum gerçeğiyle ölçülebilir ve bu benim ilk sorum. Yardımınız için şimdiden teşekkür ederiz.)

cevap

9

Spring'in ActiveDirectoryLdapAuthenticationProvider sınıfı final, bu yüzden tek gerçek seçeneğim (herhangi bir katılımcı varsa daha iyi olanları eğlendireceğim) sınıfı çatallamaktı. İçeriklerini kopyalayıp yapıştırdım, biraz geri yükledim ve final işaretini kaldırdım. Sonra, loadUserAuthorities() yöntemini geçersiz kılan çatallı sınıfın ayrı bir alt sınıfını oluşturdum ve bir izin maskesi oluşturmak için kendi kodumu ekledim. aşağıdaki gibi

o zaman benim ldap.xml dosyasını düzenlemek başardı: benim gibi başka n00bs için

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

, alt sınıf şuna benzer:

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 
} 

bir cazibe gibi çalıştı.

Yardım için zagyi'ye teşekkürler.

İlgili konular