दिलचस्प पोस्ट
दोनों ओर क्षैतिज रेखा के साथ शीर्षक Vim: निर्देशिका में फ़ाइलों पर सेटिंग्स लागू करें मैं अमान्य SSL प्रमाणपत्रों को AFNetworking के साथ अनुमति देना चाहता हूं सीएसएस डेवलपमेंट पर्यावरण की तुलना में वेब सर्वर पर अलग ढंग से प्रस्तुत करता है .NET में माइक्रोसॉफ्ट.ऑफ़िस.इंटरॉप.एक्ससेल का उपयोग करने के लिए मुझे कौन से संदर्भ की आवश्यकता है? कैसे प्रोग्रामिंग मेरे सी # आवेदन के बैंडविड्थ उपयोग को सीमित करने के लिए? कोई मेल नहीं खाता – ईस्टस्ट्रीम ओपन () नेविगेशन ड्रॉवर के साथ एक्शनबार को कैसे स्लाइड किया जाए क्या हम एक एसटीएल मानचित्र में कुंजी के लिए एक उपयोगकर्ता परिभाषित वर्ग का उपयोग कर सकते हैं? एक्सेस एसक्यूएल में केस चुनने के बराबर क्या है? ग्रहण स्वत: पूर्ण (प्रतिशत चिह्न, जूनो में) समूह द्वारा एक चर योग कैसे करें? Matplotlib में एक ग्रेडिएंट रंग रेखा कैसे साजिश की जाए? alias to chrome console.log एंड्रॉइड एक कैमरे के बिटमैप की ओरिएंटेशन प्राप्त करें? और पीछे -90 डिग्री घुमाएं

स्प्रिंग सुरक्षा: डीबी में पासवर्ड एन्कोडिंग और एप्लीकेशन कॉन्टैक्ट में

Config (applicationContext-security.xml) है:

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

दूसरी तरफ से मेरे dataSource से dataSource (यह जेडीबीसीडीओएमपीएल है ):

 ... public static final String DEF_USERS_BY_USERNAME_QUERY = "select username,password,enabled " + "from users " + "where username = ?"; ... 

अब इस कोड में sha बारे में शब्द है, इसलिए मानक स्प्रिंग सिक्योरिटी users टेबल से चयनित पासवर्ड एनकोड नहीं किया गया है।

शायद, मुझे अपने हाइबरनेट मैपिंग कॉन्फ़िग में password कॉलम के लिए कुछ sha एट्रिब्यूट प्रदान करना चाहिए:

 <class name="model.UserDetails" table="users"> <id name="id"> <generator class="increment"/> </id> <property name="username" column="username"/> <property name="password" column="password"/> <property name="enabled" column="enabled"/> <property name="mail" column="mail"/> <property name="city" column="city"/> <property name="confirmed" column="confirmed"/> <property name="confirmationCode" column="confirmation_code"/> <set name="authorities" cascade="all" inverse="true"> <key column="id" not-null="true"/> <one-to-many class="model.Authority"/> </set> </class> 

अब पासवर्ड के लिए डीबी को बचाया गया है, लेकिन इनकोडिंग होना चाहिए।

कैसे एन्कोडिंग कॉन्फ़ेक्ट कॉन्फ़िग और डीबी प्रश्नों को एक ही पासवर्ड एन्कोडिंग के लिए दोस्त बना सकता है?

Solutions Collecting From Web of "स्प्रिंग सुरक्षा: डीबी में पासवर्ड एन्कोडिंग और एप्लीकेशन कॉन्टैक्ट में"

यदि आप एक हैशिंग सिस्टम का चयन कर रहे हैं, तो एक मौजूदा डेटाबेस का उपयोग करते हुए पहले से ही हैड पासवर्ड वाले ऐप का निर्माण करने की बजाय, आपको यह सुनिश्चित करना चाहिए कि आपके हैशिंग एल्गोरिदम भी नमक का उपयोग करता है सिर्फ एक सादे डाइजेस्ट का उपयोग न करें

एक अच्छा विकल्प बीक्रिप्ट है, जिसे अब हम सीधे स्प्रिंग सुरक्षा 3.1 में BCryptPasswordEncoder ( jBCrypt का उपयोग कर कार्यान्वित) के माध्यम से समर्थन करते हैं। यह स्वचालित रूप से एक नमक उत्पन्न करता है और इसे एक स्ट्रिंग में हैश मान के साथ जोड़ता है।

कुछ डेटाबेस हैशिंग (जैसे पोस्टग्रेज़ ) के लिए अंतर्निहित समर्थन है। अन्यथा, आपको जेडीबीसी को पास करने से पहले पासवर्ड को अपने पास रखना होगा:

 String password = "plaintextPassword"; PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String hashedPassword = passwordEncoder.encode(password); 

जब आप कोई उपयोगकर्ता बनाते हैं तो पासवर्ड को सांकेतिक शब्दों में बदलना करने के लिए आपको बस इतना करना होगा

प्रमाणीकरण के लिए, आप कुछ ऐसा प्रयोग करेंगे:

 <bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> <bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="yourJdbcUserService" /> <property name="passwordEncoder" ref="encoder" /> </bean> 

स्वीकृत उत्तर पर थोड़ा और स्पष्टीकरण। आशा है कि यह किसी को मदद करता है

इसे डाटाबेस में डालने से पहले पासवर्ड को हश करें:

 String password = "plaintextPassword"; PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String hashedPassword = passwordEncoder.encode(password); 

अपने सुरक्षा- config.xml में BCryptPasswordEncoder बीन जोड़ें

प्रमाणीकरण प्रदाता वर्ग के लिए एक संपत्ति के रूप में पासवर्ड एन्कोडर जोड़ें। इसे आटोवर करें या सेटर और गेटर विधि प्रदान करें।

 @AutoWired private BCryptPasswordEncoder passwordEncoder; 

संपत्ति प्राप्त करें, जब आप प्रवेश के लिए उपयोगकर्ता को स्वस्थ बनाते हैं

 <bean id="dbAuthenticationProvider" class="mypackage.auth.spring.DBAuthenticationProvider" > <property name="dataSource" ref="routingDataSource"></property> <property name="passwordEncoder" ref="encoder" /> <property name="passwordQuery" value="select password as password from tbl where username=:username"> </property> </bean> 

और प्रमाणन वर्ग के मैच में दोनों पासवर्ड

  new BCryptPasswordEncoder().matches(plainTextPasswdFromUserInput, hashedPasswdFromDb) 

एक सरल तरीके से आप कुछ ऐसा कर सकते हैं जैसे applicationContext-security.xml

 <authentication-manager alias="authenticationManager"> <authentication-provider> <password-encoder ref="encoder"/> <jdbc-user-service data-source-ref="dataSource" users-by-username-query=" select username,password, enabled from principal where username=?" authorities-by-username-query=" select p.username, a.authority from principal p, authority a where p.id = a.principal_id and p.username=?" /> </authentication-provider> </authentication-manager> <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

जावा में

 public static String encodePasswordWithBCrypt(String plainPassword){ return new BCryptPasswordEncoder().encode(plainPassword); } 

फिर इसे जांचें

 System.out.println(encodePasswordWithBCrypt("fsdfd")); 

स्प्रिंग सुरक्षा 3.1 का उपयोग करना, यह प्रयास करें:

 <authentication-manager alias="authenticationManager"> <authentication-provider user-service-ref="service"> <password-encoder hash="sha"/> <jdbc-user-service data-source-ref="dataSource"/> </authentication-provider> </authentication-manager> <beans:bean id="dataSource" ...> ... </beans:bean> <beans:bean id="service" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <beans:property name="dataSource" ref="dataSource"/> ... </beans:bean> 

नया क्या है: authentication-provider datasource service लिए service और service बिंदुओं के लिए अंक।

संपादित करें: जावा में आपको इस तरह से कुछ के साथ पासवर्ड को एन्कोड करना होगा:

 DigestUtils.sha(request.getParameter("password")); 

चेतावनी: सावधान रहें! एमडी 5 के साथ SHA मिश्रण मत करो!

अगर आप एसएचए के रूप में authentication-provider के password-encoder को सेट करते password-encoder , तो आपको संगत रखने के लिए जावा में एन्कोड करना होगा। लेकिन अगर आप जावा में एमडी 5 के रूप में एनकोड करते हैं, तो जैसा नमूना आपको मिला है, हश को "एमडी 5" पर सेट करने के लिए मत भूलना डाइजेस्ट यूथल्स भी एमडी 5 एनकोडर प्रदान करता है:

 DigestUtils.md5(request.getParameter("password")); 

स्वीकृत उत्तर सही है। मैंने इसे स्प्रिंग 3.1 और बीक्र्रीप्ट एन्कोड एल्गोरिथम के साथ परीक्षण किया।

जब एक उपयोगकर्ता बनाते हैं

 PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword())); userDao.save(userEntity); 

जब उपयोगकर्ता लॉगिन, याद रखें, सादे पासवर्ड का उपयोग करें ( हैश नहीं )। बिलकुल इसके जैसा:

 Authentication request = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword()); Authentication result = authenticationManager.authenticate(request); SecurityContextHolder.getContext().setAuthentication(result); 

यहां सुरक्षा-कॉन्फ़िग है:

  <bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> <bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userService" /> <property name="hideUserNotFoundExceptions" value="false" /> <property name="passwordEncoder" ref="encoder" /> </bean> 

आशा है कि यह किसी की मदद करेगा!

एनोटेशन के साथ ऐसा करने के लिए सिर्फ एक टिप

 @Configuration @EnableWebSecurity @PropertySource("classpath://configs.properties") public class SecurityContextConfig extends WebSecurityConfigurerAdapter { @Autowired @Qualifier("userDetailsService") private UserDetailsService userDetailsService; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(getPasswordEncoder()); } @Bean(name = "passwordEncoder") public PasswordEncoder getPasswordEncoder(){ return new BCryptPasswordEncoder(); } } 

3.1.x के साथ यह मैपिंग auth के लिए काम नहीं करता है। काम करने का तरीका है:

 <beans:bean id='bCryptPasswordEncoder' class='org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'></beans:bean> <authentication-manager> <authentication-provider user-service-ref="userDetailsService"> <password-encoder ref="bCryptPasswordEncoder"/> </authentication-provider> </authentication-manager>