2012-05-23 20 views
5

मैं ओपनआईडी प्रदाता के साथ एक सफल प्रमाणीकरण के बाद एक स्थिति को संभालने की कोशिश कर रहा हूं, मुझे पता चलता है कि उपयोगकर्ता openId पहचानकर्ता से जुड़े मेरे डीबी में कोई खाता नहीं है।स्प्रिंग सुरक्षा ओपनआईडी समर्थन और उपयोगकर्ता प्रमाणीकरण

क्या आप मुझे बता सकते हैं कि मुझे स्थिति को कैसे संभालना चाहिए। अब, मैं रजिस्टर फॉर्म प्रदर्शित कर रहा हूं और एक खाता बनाने के लिए उपयोगकर्ता से पूछता हूं। हालांकि, मुझे उपयोगकर्ता प्रमाणीकरण स्थिति में कोई समस्या है, अब उसे वसंत सुरक्षा कॉन्टेक्स्ट क्लास द्वारा प्रमाणीकृत के रूप में देखा जा रहा है।

"नए उपयोगकर्ता पेज को पंजीकृत करने" पर रीडायरेक्ट करने से पहले मैं अपने नियंत्रक कार्रवाई में उपयोगकर्ता को कैसे प्रमाणित करूं? क्या यह दृष्टिकोण एक अच्छा है या क्या मुझे इसे किसी अन्य तरीके से करना चाहिए?

उत्तर

2

ठीक है, इसलिए सैमुअल के पद में वर्णित प्राधिकरण से प्रमाणीकरण को अलग करना वास्तव में सहायक था। हालांकि अभी भी कई गॉथस हैं और मुझे अभी भी अव्यवस्था मिली है क्योंकि वसंत में उपयोगकर्ता की नई भूमिकाओं में जोड़ने का कोई आसान तरीका नहीं है। तो सबसे आसान तरीका है कि उपयोगकर्ता को फिर से लॉगिन करने के लिए मजबूर करना और लॉगिन के दौरान स्प्रिंग हैंडल रोल असाइनमेंट देना।

SecurityContextHolder.clearContext(); 

एक विकल्प के रूप में आप अपने UserDetailsService कार्यान्वयन में एक अपवाद फेंक कर सकते हैं (नीचे देखें):

आदेश में वसंत सुरक्षा में deauthenticate उपयोगकर्ता के लिए आप को लागू करने की है। इसका नकारात्मक पक्ष है कि आप उपयोगकर्ता को प्रमाणित करेंगे और उपयोगकर्ता संदर्भ डेटा खो देंगे, इसलिए नए स्थानीय खाते को बनाने की प्रक्रिया के दौरान ओपनिड खाते के साथ नए उपयोगकर्ता accout से मिलान करना असंभव होगा। और पारंपरिक उपयोगकर्ता नाम और पासवर्ड के साथ उपयोगकर्ता लॉगिन के बाद आपको उन खातों से मेल खाना पड़ेगा। मेरा समाधान नया खाता बनाने के बाद उपयोगकर्ता को प्रमाणित करना था।

public final class MyUserDetailsService implements UserDetailsService { 
    private final UsersDao usersDao; 

    @Autowired 
    public UserDetailsServiceImpl(final UsersDao usersDao) { 
     this.usersDao = usersDao; 
    } 

    @Override 
    public UserDetails loadUserByUsername(final String username) {  
      UserEntity user = usersDao.getUserByOpenIdIdentifier(username); 
      if (user == null) { 
        // there is no such user in our db, we could here throw 
        // an Exception instead then the user would also be deuthenticated 
        return new User(username, "", new ArrayList<GrantedAuthority>()); 
      } 

      //here we are granting to users roles based on values from db 
      final Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
      authorities.add(new SimpleGrantedAuthority(user.getUserType().toString())); 

      final UserDetails result = new User(username, "", authorities); 

      return result; 
    } 
} 
:

आदेश में इस यहाँ उपयोगी पाते उपयोगकर्ता भूमिकाओं (विशेषाधिकार) प्रदान करने के लिए आप UserDetailsService ओवरराइड करने के लिए है, मामले में किसी को मेरे कार्यान्वयन है

1

मुझे लगता है कि आप दो अवधारणाओं मिश्रण हो सकता है: प्रमाणीकरण और प्राधिकरण। प्रमाणीकरण यह जान रहा है कि उपयोगकर्ता कौन है, प्राधिकरण किसी सुविधा के संसाधन का उपयोग करने का अधिकार है।

वसंत सुरक्षा में, यह दो अवधारणाओं प्रमाणीकरण-प्रबंधक और पहुँच-निर्णय प्रबंधक द्वारा कार्यान्वित कर रहे हैं।

तथ्य यह है कि कोई उपयोगकर्ता आपके डेटाबेस में मौजूद नहीं है, उसे अस्वीकार करने का कोई कारण नहीं है पहचान: कोई प्रमाणीकरण नहीं! लेकिन प्रमाणीकृत मधुमक्खी पहुंच निर्णय प्रबंधन में एक मानदंड हो सकता है। उदाहरण: प्रमाणीकृत वोटर।

आप प्रमाणीकरण पर नहीं छूना चाहिए, बल्कि उसे एक्सेस-निर्णय प्रबंधक निम्नलिखित नियम लागू करने के लिए अनुकूलित:

  • किसी उपयोगकर्ता को अपने डेटाबेस में मौजूद खाता निर्माण सुविधा के अलावा सब कुछ की पहुंच है
  • एक उपयोगकर्ता जो आपके डेटाबेस में मौजूद नहीं है केवल खाता निर्माण सुविधा तक पहुंच है।

यह सब एक्सेस प्रबंधन के बारे में है, प्रमाणीकरण नहीं।

पढ़ें में अधिक http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-access-manager

पुनश्च: प्रलेखन वसंत सुरक्षा में संपूर्ण नहीं है, लेकिन स्रोत कोड बहुत पठनीय है। मेरी सलाह है कि इसे जांचें और उन तत्वों के कार्यान्वयन को देखें जो आपको अनुकूलित करने के लिए आवश्यक हैं।

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