2013-04-19 9 views
9

मैं सफलतापूर्वक प्रमाणित करने के लिए LDAP के माध्यम से सक्रिय निर्देशिका से कनेक्ट हो जाते हैं, और मेरे ldap.xml में निम्नलिखित के साथ मैं बुलाया गया है मेरे कस्टम अधिकारियों populator:मैं स्प्रिंग सुरक्षा और 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> 

यह ठीक काम करता है, और मैं उपयोगकर्ता के पता लगाने कर सकते हैं प्राधिकरण उसके समूह सदस्यता के आधार पर है, लेकिन मैं नहीं बल्कि निर्मित सक्रिय निर्देशिका 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> 

ऊपर के साथ समस्या यह है कि मेरे कस्टम अधिकारियों populator (जाहिर है) है नहीं कहा जाता है, जबकि मैं अपने उपयोगकर्ताओं को प्रमाणित कर सकता हूं (जो ऊपर के साथ काम करता है), मैं समूह के बिना छोड़ दिया गया है (जिसे मुझे प्राधिकरण निर्धारित करने की आवश्यकता है)।

मुझे लगता है कि यह एक साधारण सवाल है, लेकिन मेरे जीवन के लिए मुझे यहां या कहीं और जवाब नहीं मिल रहा है। क्या मुझे ActiveDirectoryLdapAuthenticationProvider क्लास का विस्तार करना है, और वहां से मेरे अधिकारियों के पॉप्युलेटर को कॉल करना है?

(इस साइट ने मुझे कई वर्षों तक चलने वाली सभी मदद के लिए धन्यवाद; इस साइट की प्रभावशीलता इस तथ्य से गिनती जा सकती है कि मैंने हाल ही में एक खाता बनाने के लिए परेशान किया है, और यह मेरा पहला सवाल है। आपकी मदद के लिए अग्रिम धन्यवाद।)

उत्तर

9

वसंत की सक्रिय डायरेक्टरी Ldap प्रमाणीकरणप्रदाता वर्ग final है, इसलिए मेरा एकमात्र असली विकल्प (यदि कोई लेकर्स है तो मैं बेहतर लोगों का मनोरंजन करूंगा) कक्षा को फोर्क करना था। मैंने इसकी सामग्री की प्रतिलिपि बनाई और चिपकाया, थोड़ा सा प्रतिक्रिया दी, और final पदनाम को हटा दिया। फिर, मैंने फोर्कड क्लास का एक अलग उप-वर्ग बनाया, loadUserAuthorities() विधि को ओवरराइड किया, और अनुमति मास्क बनाने के लिए अपना कोड जोड़ा।

मैं इस प्रकार है तो मेरे ldap.xml फ़ाइल को संपादित करने में सक्षम था:

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

मेरे जैसे किसी अन्य n00bs के लिए, उपवर्ग इस तरह दिखता है:

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 
} 

एक आकर्षण की तरह काम किया।

सहायता के लिए ज़ागई के लिए बहुत धन्यवाद।

संबंधित मुद्दे