authentication वसंत सुरक्षा कस्टम प्रमाणीकरण और पासवर्ड एन्कोडिंग




passwords spring-security (3)

एक बीन से वैश्विक नमक को पुनः प्राप्त करने के लिए, स्प्रिंग एक्सप्रेशन भाषा या स्पेल का उपयोग करें।

<beans:bean id="encoder" 
        class="org.springframework.security.crypto.password.StandardPasswordEncoder">
    <constructor-arg value="#{someotherBean.somePropertyWithAGetterMethod"/>
</beans:bean>

क्या वहां कोई ट्यूटोरियल है या क्या किसी के पास स्प्रिंग-सिक्योरिटी के साथ निम्न कार्य करने के बारे में पॉइंटर्स हैं?

कार्य:

मुझे प्रमाणीकरण उपयोगकर्ता नाम के लिए अपने डेटाबेस से नमक प्राप्त करने की आवश्यकता है और इसे संग्रहीत एन्क्रिप्टेड पासवर्ड (उर्फ उपयोगकर्ता को प्रमाणीकृत) से तुलना करने के लिए प्रदान किए गए पासवर्ड (लॉगिन पेज से) को एन्क्रिप्ट करने के लिए इसका उपयोग करें।

अतिरिक्त जानकारी:

मैं एक कस्टम डेटाबेस संरचना का उपयोग करें। एक UserDetails ऑब्जेक्ट एक कस्टम UserDetailsService के माध्यम से बनाया गया है जो बदले में डेटाबेस से जानकारी प्राप्त करने के लिए कस्टम DAOProvider का उपयोग करता है।

मेरी security.xml फाइल अब तक:

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
    </authentication-provider>
</authentication-manager>

अब मुझे लगता है कि मुझे इसकी आवश्यकता होगी

        <password-encoder hash="sha" />

लेकिन और क्या? मैं पासवर्ड को एन्कोड करने के लिए डेटाबेसप्रोवाइड नमक का उपयोग करने के लिए वसंत सुरक्षा कैसे बता सकता हूं?

संपादित करें :

मैंने यह एसओ पोस्ट सूचनात्मक होने के लिए पाया लेकिन पर्याप्त नहीं: अगर मैं अपने एक्सएमएल में नमक स्रोत को पासवर्ड एन्कोडर द्वारा उपयोग करने के लिए परिभाषित करता हूं, जैसे:

        <password-encoder ref="passwordEncoder">                
            <salt-source ref="saltSource"/>
        </password-encoder>

मुझे अपने कस्टम नमक का उपयोग करने के लिए एक कस्टम साल्टसोर्स लिखना होगा। लेकिन यह UserDetails ऑब्जेक्ट के अंदर नहीं पाया जा सकता है। इसलिए...

वैकल्पिक 1:

क्या मैं उपयोगकर्ता विवरण के कस्टम कार्यान्वयन का उपयोग कर सकता हूं जिसके बाद नमक की संपत्ति हो सकती है?

<beans:bean id="saltSource" class="path.to.MySaltSource"
    p:userPropertyToUse="salt"/>

तथा

@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService {
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

        // ...
        return buildUserFromAccount(account);
    }

    @Transactional(readOnly = true)

    UserDetailsImpl buildUserFromAccount(Account account){

        // ... build User object that contains salt property
}

कस्टम उपयोगकर्ता कक्षा:

public class UserDetailsImpl extends User{

    // ...

    private String salt;

    public String getSalt() { return salt; }

    public void setSalt(String salt) { this.salt = salt; }
}

security.xml:

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder hash="sha">                
        <salt-source ref="saltSource"/>
    </password-encoder>
    </authentication-provider>
</authentication-manager>

<beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource" p:userPropertyToUse="salt"/>


वैकल्पिक 2:

अन्यथा मुझे डेटाबेस से दिए गए userName लिए नमक निकालने के लिए सॉल्टसोर्स में अपना खाता डीडीए इंजेक्ट करना होगा।

लेकिन: स्प्रिंग सिक्योरिटी SaltSource कैसे कॉल SaltSource ? हमेशा saltSource.getSalt(userDetails) ?

तो मुझे यह सुनिश्चित करना होगा कि मेरा SaltSource नमक को पुनः प्राप्त करने के लिए मेरे accountDAO userDetails.accountName पर SaltSource का उपयोग करता है।

EDIT2:

बस इतना पता चला कि मेरा दृष्टिकोण है .. विरासत .. :( तो मुझे लगता है कि मैं केवल StandardPasswordEncoder पासवर्डवर्डकोडर का उपयोग करूंगा (जिसे मुझे अभी भी समझना है कि वास्तव में कैसे उपयोग करना है)।

बीटीडब्लू: मैंने उपयोगकर्ता विकल्प को विस्तारित करने वाले कस्टम उपयोगकर्ता डिस्प्ले क्लास के साथ पहला विकल्प लागू किया और केवल एक नमक संपत्ति जोड़ना जो कि सॉल्टसोर्स को उपयोगकर्ताप्रॉपर्टी के रूप में पास किया जा सकता है जैसे कि इसे संपादित 1 में उल्लिखित एसओ पोस्ट में प्रस्तावित किया गया है ...

संपादित करें 3:

बस मानक पासवर्डवर्डकोडर काम कर रहा है, इसलिए मैं यहां कुछ पॉइंटर्स छोड़ दूंगा:

प्रमाणीकरण के लिए StandardPasswordEncoder का उपयोग करें:

<beans:bean id="encoder" 
    class="org.springframework.security.crypto.password.StandardPasswordEncoder">
</beans:bean>


<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder ref="encoder" />         
    </authentication-provider>
</authentication-manager>

इसके लिए संस्करण 3.1.0.आरसी में वसंत-सुरक्षा-क्रिप्टो मॉड्यूल की आवश्यकता है? जहाँ तक मुझे पता है। 3.0 में कोई रिपॉजिटरी नहीं मिल सका। संस्करण (भले ही कहीं भी इसमें सूचीबद्ध संस्करण थे जिसमें 3.0.6 शामिल थे और इसी तरह)। इसके अलावा दस्तावेज वसंत सुरक्षा 3.1 के बारे में बात करते हैं, इसलिए मुझे लगा, मैं बस इसके साथ जाऊंगा।

उपयोगकर्ता बनाते समय (मेरे लिए केवल एक व्यवस्थापक ही ऐसा कर सकता है), मैं बस उपयोग करता हूं

        StandardPasswordEncoder encoder = new StandardPasswordEncoder();
        String result = encoder.encode(password);

और मैं कर रहा हूँ।

स्प्रिंग सुरक्षा यादृच्छिक रूप से नमक बनाती है और डेटाबेस में इसे संग्रहीत करने से पहले इसे पासवर्ड स्ट्रिंग में जोड़ती है, इसलिए अब कोई नमक कॉलम की आवश्यकता नहीं है

हालांकि कोई भी रचनात्मक तर्क के रूप में वैश्विक नमक प्रदान कर सकता है ( new StandardPasswordEncoder("12345"); ), लेकिन मुझे नहीं पता था कि एक स्थिर स्ट्रिंग की आपूर्ति के बजाय एक बीन से उस मान को पुनर्प्राप्त करने के लिए मेरी सुरक्षा कॉन्फ़िगरेशन कैसे सेट अप करें <constructor-arg name="secret" value "12345" /> । लेकिन मुझे नहीं पता कि वैसे भी इसकी कितनी जरूरत है।



मैं इसे उत्तर के रूप में चिह्नित करूंगा, क्योंकि मैंने अपनी समस्या हल की है और कोई अन्य टिप्पणी या उत्तर नहीं दिए गए थे:

1 संपादित करें - वैकल्पिक 1 मूल प्रश्न का उत्तर देता है

लेकिन मुझे यह सीखना पड़ा कि कस्टमाइज़ किया गया पासवर्ड लवण एक विरासत दृष्टिकोण है जिसे स्प्रिंग सिक्योरिटी 3.1 में और आवश्यकता नहीं है, जैसा कि मैंने वर्णन किया है

3 संपादित करें जहां मैंने कुछ पॉइंटर्स छोड़े हैं कि पासवर्ड के साथ संग्रहीत स्वचालित नमक के लिए StandardPasswordEncoder पासवर्डवर्डकोडर का उपयोग कैसे करें।







salt