2013-08-13 8 views
16

मैं इस कई बार उत्तर दिया गया है पता है, लेकिन मैं उलझन में हूँ। मेरे पास पहले से ही मेरे आवेदन में एक प्रमाणीकरण तंत्र है और मैं बस स्प्रिंग एमवीसी के प्राधिकरण भाग का उपयोग करना चाहता हूं। मैं इंटरनेट पर खोज करते हैं तो मैं वसंत MVC 3 और स्प्रिंग सुरक्षा 3.वसंत सुरक्षा 3 में कस्टम प्रमाणीकरण को कैसे कार्यान्वित करें?

उपयोग कर रहा हूँ मैं दो समाधान पाया, पहले एक बस AuthenticationProvider इंटरफ़ेस को लागू करने के लिए है। Example1। दूसरा उपयोगकर्ता UserDetails और UserDetailsService को लागू करना है, Example2 इसलिए मैं यहां खो गया हूं।

---- अद्यतन ----

प्रश्न के दूसरे भाग here है। और कामकाज का समाधान।

उत्तर

37

ज्यादातर मामलों में जब केवल प्रमाणीकरणों और प्राधिकरण के लिए भूमिकाओं के लिए उपयोगकर्ता नाम और पासवर्ड का उपयोग करते हुए, अपने खुद के UserDetailsService को लागू करने के लिए पर्याप्त है। इस प्रकार

उपयोगकर्ता नाम पासवर्ड प्रमाणीकरण के प्रवाह को तो आम तौर पर है:

  • एक वसंत सुरक्षा फिल्टर (मूल प्रमाणीकरण/प्रपत्र/..) उपयोगकर्ता नाम और पासवर्ड को चुनता है, यह एक UsernamePasswordAuthentication वस्तु में बदल जाता है और AuthenticationManager
  • प्रमाणीकरण प्रबंधक एक उम्मीदवार प्रदाता जो UsernamePasswordtokens संभाल कर सकते हैं, इस मामले में DaoAuthenticationProvider है जो और प्रमाणन के लिए साथ टोकन गुजरता के लिए लग रहा है करने के लिए पर यह गुजरता
  • प्रमाणीकरण प्रदाता विधि loadUse का आह्वान rByUsername इंटरफेस और या तो एक UsernameNotFound अपवाद फेंकता है तो उपयोगकर्ता मौजूद नहीं है या रिटर्न एक UserDetails वस्तु है, जो एक उपयोगकर्ता नाम, पासवर्ड और अधिकारियों में शामिल है।
  • प्रमाणीकरण प्रदाता तो तुलना प्रदान की UsernamePasswordToken और UserDetails के पासवर्ड को आपत्ति है। (यह पासवर्डएन्कोडर्स के माध्यम से पासवर्ड हैश को भी संभाल सकता है) यदि यह मेल नहीं खाता है तो प्रमाणीकरण विफल हो जाता है। यदि यह मेल खाता है तो यह उपयोगकर्ता विवरण ऑब्जेक्ट को पंजीकृत करता है और इसे AccessDecisionManager पर भेजता है, जो प्राधिकरण भाग करता है।

तो यदि दाओ प्रमाणीकरणप्रदाता में सत्यापन आपकी आवश्यकताओं के अनुरूप है। फिर आपको केवल अपनी खुद की UserDetailsService को लागू करना होगा और DaoAuthenticationProvider के सत्यापन को ट्वीक करना होगा।

UserDetailsService वसंत 3.1 उपयोग करने के लिए

एक उदाहरण इस प्रकार है:

स्प्रिंग एक्सएमएल:

<security:authentication-manager> 
    <security:authentication-provider user-service-ref="myUserDetailsService" /> 
</security:authentication-manager> 

<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" /> 

UserDetailsService कार्यान्वयन:

public MyUserDetailsService implements UserDetailsService { 

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    //Retrieve the user from wherever you store it, e.g. a database 
    MyUserClass user = ...; 
    if (user == null) { 
     throw new UsernameNotFoundException("Invalid username/password."); 
    } 
    Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("Role1","role2","role3"); 
    return new User(user.getUsername(), user.getPassword(), authorities); 
} 

} 
+0

मैं तुम्हें पता है अगर यह काम करता है दूँगा। धन्यवाद। –

+0

इस तरह से मैं लॉगिन वर्कफ़्लो को कस्टमाइज़ नहीं कर सकता। आइए कहें कि मैं उपयोगकर्ता को 5 वें प्रयास पर अवरुद्ध करना चाहता हूं या एक ईमेल भेजना चाहता हूं। मैं यही देख रहा हूँ। –

+0

मेरा सुझाव DAOAuthenticationManager को उप-वर्गीकृत करना होगा, प्रमाणीकरण विधि को ओवरराइड करें और केवल कोशिश करें में सुपर। प्रमाणीकरण का आह्वान करें। – Nils

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