2013-02-05 21 views
10

क्या प्रमाणीकरण/UserDetailsImpl ऑब्जेक्ट में List<GrantedAuthority> सेट करने के लिए वैसे भी है? मेरे आवेदन में, मेरे पास सुरक्षा की दो परतें हैं, एक लॉग इन करने के लिए (जो मेरे कस्टम लॉगिन प्रमाणीकरणकर्ता का उपयोग करता है, कक्षा में मैंने Authentication ऑब्जेक्ट को UsernamePasswordAuthenticationToken का उपयोग करके सेट किया है) और एक "चुनौती प्रश्न" के लिए जहां उपयोगकर्ता को उत्तर देने के लिए कहा जाता है एक विशेष सवालवसंत सुरक्षा: सेट किया गया प्राधिकृत

मैं क्या करना चाहता हूं GrantedAuthority वर्तमान List<GrantedAuthority> में जोड़ें, जिसे लॉगिन प्रक्रिया के दौरान बनाया गया था, उपयोगकर्ता चुनौती प्रश्न का उत्तर देने के बाद।

क्या यह संभव है?

+0

एक बात UserDetails कार्यान्वयन है क्या वर्ग है। स्प्रिंग UserDetailsImpl नामक कोई कक्षा प्रदान नहीं करता है। JdbcDaoImpl उपयोगकर्ता वर्ग का एक उदाहरण बनाता है, जबकि एलडीएपी संस्करण LdapUserDetailsImpl का एक उदाहरण बनाता है। तो यह वास्तव में बहुत निर्भर है कि आप किस प्रकार की वस्तु वापस प्राप्त कर रहे हैं चाहे आप अधिकारियों को बदल सकें। मैंने कभी भी स्प्रिंग-प्रदत्त उपयोगकर्ता डिस्प्ले कार्यान्वयन में से एक का उपयोग कभी नहीं किया है, क्योंकि अधिकारियों के लिए अपरिवर्तनीय सेट जैसी चीजों की वजह से, जो कि बदल सकती है। –

उत्तर

8

आप निम्नलिखित कोड के साथ कर सकते हैं: इस पर स्पष्ट करने के लिए

Collection<SimpleGrantedAuthority> oldAuthorities = (Collection<SimpleGrantedAuthority>)SecurityContextHolder.getContext().getAuthentication().getAuthorities(); 
SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_ANOTHER"); 
List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>(); 
updatedAuthorities.add(authority); 
updatedAuthorities.addAll(oldAuthorities); 

SecurityContextHolder.getContext().setAuthentication(
     new UsernamePasswordAuthenticationToken(
       SecurityContextHolder.getContext().getAuthentication().getPrincipal(), 
       SecurityContextHolder.getContext().getAuthentication().getCredentials(), 
       updatedAuthorities) 
); 
0

UserDetails.getAuthorities() विधि केवल Collection<GrantedAuthority> ऑब्जेक्ट देता है। आप उस संग्रह में अपना नया प्राधिकरण जोड़ने के लिए उपयुक्त Collection विधि का उपयोग कर सकते हैं।

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
if (principal instanceof UserDetails) { 
    ((UserDetails) principal).getAuthorities().add(New GrantedAuthorityImpl("ROLE_FOO")); 
} 

सेला।

+1

संग्रह में शामिल नहीं किया जा सकता है -> UnmodifiableCollection – Slavak

+0

@Slavak यह वास्तव में निर्भर करेगा कि आप उपयोगकर्ता के विवरण के लिए किस कार्यान्वयन का उपयोग कर रहे हैं। हम अपने कार्यान्वयन में org.springframework.security.core.userdetails से उपयोगकर्ता वर्ग का उपयोग नहीं करते हैं। जाहिर है अगर आपको अधिकारियों को सेट या संशोधित करने की आवश्यकता है, जहां कार्यान्वयन का उपयोग किया जा रहा है और वहां कोई सेट प्राधिकरण() विधि नहीं है (जिसे उपयोगकर्ता विवरण इंटरफ़ेस पर वादा नहीं किया गया है) का अर्थ यह होगा कि प्रश्न का उत्तर सिर्फ नहीं है। नहीं, यह संभव नहीं है। अन्यथा, आपको UserDetails का अपना कार्यान्वयन प्रदान करना होगा, जो कि सबसे लचीली ऐप्स को वैसे भी करने की ज़रूरत है। –

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