2011-12-28 15 views
6

मैं चाहूँगा की तरह नमक जोड़ने के लिए:कस्टम UserDetails के लिए स्प्रिंग सुरक्षा नमक

PasswordEncoder encoder = new ShaPasswordEncoder(); 
     userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails)); 

जहाँ तक userDetails अपने कस्टम UserDetail वर्ग के उदाहरण, मैं इस वसंत वर्ग के लिए यह कास्ट करने के लिए बाध्य है: UserDetails , लेकिन जैसा कि यह तार्किक उम्मीद है मैं क्रम में मिला:

java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails 

config:

<beans:bean id="saultSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource"> 
     <beans:property name="userPropertyToUse" value="username"/> 
</beans:bean> 

<authentication-manager alias="authenticationManager"> 
<authentication-provider> 
<password-encoder hash="sha"> 
    <salt-source user-property="username"/> 
</password-encoder> 
    <jdbc-user-service data-source-ref="dataSource"/> 
</authentication-provider> 
</authentication-manager> 

मैं इस मामले में नमक को सही तरीके से कैसे कॉन्फ़िगर कर सकता हूं?

उत्तर

3

ReflectionSaltSource केवल एक UserDetails वस्तु (मुझे लगता है कि जहां वर्ग के कलाकारों अपवाद मिलता है यह सोचते हैं रहा हूँ?) के साथ काम करता है ताकि आपको यह या तो UserDetails लागू करने या अपने खुद के SaltSource कार्यान्वयन जो अपने उद्देश्य के साथ काम करता है पैदा करेगा।

हालांकि, मैं उपयोगकर्ता की संपत्ति का उपयोग नमक के रूप में नहीं करता जबतक कि आप एक विरासत प्रणाली के साथ काम नहीं कर रहे हैं जो पहले से ही ऐसा करता है। उपयोगकर्ता नाम बहुत अच्छा नमक मूल्य नहीं है। पासवर्ड के साथ संग्रहीत एक यादृच्छिक नमक का उपयोग करना बेहतर है। एक अच्छा उदाहरण बीसीआरपीटी एल्गोरिदम है। वसंत सुरक्षा 3.1 के साथ इसका उपयोग करने के उदाहरण के लिए this question पर मेरा उत्तर देखें। जैसा कि समझाया गया है, बीक्रिप्ट स्वचालित रूप से एक यादृच्छिक नमक उत्पन्न करता है जो इसे उसी स्ट्रिंग में रखता है जो हैश पासवर्ड के रूप में होता है।

ध्यान दें कि वास्तव में वसंत सुरक्षा 3.1 "क्रिप्टो" पैकेज (org.springframework.security.crypto.password में) में एक नया PasswordEncoder इंटरफ़ेस है। इसमें API methods में नमक शामिल नहीं है, क्योंकि यह मानता है कि नमक आंतरिक रूप से उत्पन्न होता है (क्योंकि यह बीसीआरटीपी कार्यान्वयन के साथ है)। ढांचा आम तौर पर इनमें से एक या विरासत org.springframework.security.authentication.encoding.PasswordEncoder स्वीकार करेगा।

+0

'BCryptPasswordEncoder' – Roadrunner

+0

@Luke के लिए +1, जैसा कि मैं आपके लिंक किए गए पोस्ट से समझता हूं, 'बीसीआरपीटी' में पहले से ही नमक है। मैं इस मामले में नमक कैसे कॉन्फ़िगर कर सकता हूं? क्या यह 'बीसीआरपीटी' का उपयोग करते समय कॉन्फ़िगर करने योग्य है? वहां कहा गया: "यह स्वचालित रूप से एक नमक उत्पन्न करता है और इसे एक स्ट्रिंग में हैश मान के साथ जोड़ता है" – sergionni

+1

@sergionni: स्प्रिंग सुरक्षा में एपीआई परिवर्तन देखें! 3.0.x में [passwordEncoder] (http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/authentication/encoding/PasswordEncoder.html) नमक का उपयोग करता है पासवर्ड एन्कोड करने के लिए। लेकिन 3.1.x में [पासवर्डएन्कोडर] (http://static.springsource.org/spring-security/site/docs/3.1.x/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html) नहीं ' नमक का उपयोग नहीं करते हैं। ल्यूक की सलाह संस्करण 3.1.x ** केवल ** के लिए है। – Roadrunner

1

आपका model.UserDetails वर्ग इंटरफ़ेसorg.springframework.security.core.userdetails.UserDetails को लागू करना चाहिए - यह एक वर्गorg.springframework.security.core.userdetails.User होने की जरूरत नहीं है।

तुम भी this answer पर एक नज़र कैसे दोनों एन्कोडिंग और डिकोडिंग पासवर्ड के लिए एक ReflectionSaltSource स्थापित करने के लिए देखते हैं, या मदद आप बड़ी तस्वीर BCryptPasswordEncoder पर ल्यूक के महान टिप का पालन करने के लिए हो सकता है।

+0

मैंने आपकी पोस्ट पहले देखी थी। जैसा कि मैं समझता हूं, वर्ग 'कस्टम यूज़र डिस्प्ले' में वसंत की 'उपयोगकर्ता डिस्प्ले' लागू होती है, है ना? मामला यह है कि, मुझे अभी इसे लागू करने की आवश्यकता नहीं है। मेरा कस्टम 'उपयोगकर्ता विवरण' काफी है छोटा और यह काफी है। – sergionni

+1

@sergionni: यह सिर्फ एक उदाहरण प्लेसहोल्डर था - आप 'customUserDetails' के स्थान पर 'org.springframework.security.core.userdetails.UserDetails' के किसी भी कार्यान्वयन का उपयोग कर सकते हैं - यह आपका स्वयं का, या तो छोटा या विशेषतापूर्ण हो सकता है, या एक ढांचे 'org.springframework.security.core.userdetails.User' के साथ प्रदान किया गया। मेरी पोस्ट का मुख्य भाग हालांकि 'सॉल्टसोर्स' को कॉन्फ़िगर करने के बारे में था। – Roadrunner

0

मैं इन जानकारी यहां से कुछ के बारे में एक ब्लॉग पोस्ट में लिखा है: http://rtimothy.tumblr.com/post/26527448708/spring-3-1-security-and-salting-passwords ल्यूक कोड लिखा था तो वह निश्चित रूप से जानते हैं कि वह किस बारे में बात कर रहा है, लेकिन मैं खुद को एक कठिन समय इस जानकारी groking होने सहित कई लोगों से देखते हैं, उम्मीद है कि मदद मिलेगी।