स्प्रिंग सिक्योरिटी के साथ ओपनआईडी प्रमाणीकरण को लागू करने का सही तरीका समझने की कोशिश कर रहा है।स्प्रिंग सिक्योरिटी ओपनआईडी - उपयोगकर्ता डिस्प्ले सर्विस, प्रमाणीकरण यूज़र डिस्प्ले सर्विस
public class OpenIDUserDetailsService implements
UserDetailsService,
AuthenticationUserDetailsService {
@Override
public UserDetails loadUserByUsername(String openId) throws
UsernameNotFoundException, DataAccessException {
// I either want user email here
// or immediately delegate the request to loadUserDetails
}
@Override
public UserDetails loadUserDetails(Authentication token) throws
UsernameNotFoundException {
// This never gets called if I throw from loadUserByUsername()
}
private MyCustomUserDetails registerUser(String openId, String email) {
...
}
}
मैं परिदृश्य पर विचार कर रहा हूं जब उपयोगकर्ता अभी तक मेरे आवेदन में पंजीकृत नहीं है। उपयोगकर्ता को पंजीकृत करने के लिए, मुझे इसके ओपनआईडी और ईमेल को जानना होगा।
जब ओपनआईडी प्रदाता उपयोगकर्ता को मेरे एप्लिकेशन पर वापस रीडायरेक्ट करता है, तो loadUserByUsername()
कहा जाता है, लेकिन इस मामले में मुझे केवल उपयोगकर्ता के ओपनआईडी के बारे में पता है। तो, मैं UsernameNotFoundException
फेंक रहा हूं और फिर loadUserDetails()
कभी नहीं बुलाया जाता है, इसलिए मैं उपयोगकर्ता को पंजीकृत नहीं कर सकता।
यहां सामान्य समाधान क्या है? क्या होगा यदि मैं से loadUserByUsername()
से कुछ वापस लौटाता हूं और फिर, जब loadUserDetails()
कहा जाता है, तो मैं उपयोगकर्ता को पंजीकृत करता हूं और फिर वास्तविक MyCustomUserDetails
देता हूं?
मैं वसंत सुरक्षा 3.0.7.RELEASE
यह सही नहीं है। 3.1 में, OpenIDAuthenticationProvider में UserDetailsService और प्रमाणीकरणUserDetailsService दोनों के लिए सेटर्स हैं और जो सेटटर का उपयोग किया जाता है, उसके आधार पर loadUserByUsername या loadUserDetails को कॉल करता है। 3.0.7 में, प्रमाणीकरण उपयोगकर्ता जानकारी के लिए कोई सेटटर नहीं था और इसलिए यह हमेशा loadUserByUsername का उपयोग करता था। – Ritesh