2012-03-28 20 views
22

साथ उपयोगकर्ता अद्यतन पर अधिकारियों को फिर से लोड करने के लिए मैं वसंत सुरक्षा का उपयोग कर OpenID द्वारा प्रमाणीकरण के साथ एक आवेदन कर रहा हूँ। जब उपयोगकर्ता लॉग-इन होता है, तो कुछ अधिकारी अपने सत्र में लोड होते हैं।कैसे स्प्रिंग सुरक्षा

मैं पूर्ण अधिकार के साथ उपयोगकर्ता जो (, वापस ले भूमिकाओं को जोड़ने) को संशोधित कर सकते हैं अधिकारियों दूसरों प्रयोक्ताओं की है। मेरा सवाल है, उपयोगकर्ता सत्र अधिकारियों को गतिशील रूप से कैसे बदला जाए? (सुरक्षा कॉन्टेक्स्टहोल्डर का उपयोग नहीं कर सकता क्योंकि मैं एक और उपयोगकर्ता सत्र बदलना चाहता हूं)। उपयोगकर्ता सत्र रद्द करना है, लेकिन कैसे:

सरल तरीका

? बेहतर तरीका: नए अधिकारियों के साथ उपयोगकर्ता सत्र रीफ्रेश करें, लेकिन कैसे करें?

उत्तर

6

प्रमुख मुद्दा - आप उन SecurityContext रों उपयोग करने में सक्षम होना चाहिए।

आप सर्वलेट वातावरण में हैं और अपने securityContextPersistenceFilter में HttpSessionsecurityContextRepository के रूप में प्रयोग कर रहे हैं, तो यह वसंत का SessionRegistry के साथ किया जा सकता है। उपयोगकर्ता को फिर से लिखने के लिए मजबूर करने के लिए (यह चुप अनुमतियों के निरसन से बेहतर होना चाहिए) अपने HttpSession को अमान्य कर दें। HttpSessionEventPublisher जोड़ने के लिए आप धागे की स्थानीय securityContextRepository उपयोग कर रहे हैं

<listener> 
    <listener-class> 
     org.springframework.security.web.session.HttpSessionEventPublisher 
    </listener-class> 
</listener> 

web.xml के लिए मत भूलना, तो आप कस्टम फ़िल्टर springSecurityFilterChain को SecurityContext रों रजिस्ट्री प्रबंधन करने के लिए जोड़ना चाहिए। ऐसा करने के लिए आपको सादा-बीन springSecurityFilterChain कॉन्फ़िगरेशन (security नामस्थान शॉर्टकट के बिना) का उपयोग करना होगा। कस्टम फ़िल्टर के साथ सादा-बीन कॉन्फ़िगरेशन के साथ आपके पास प्रमाणीकरण और प्रमाणीकरण पर पूर्ण नियंत्रण होगा।

कुछ लिंक है, वे वास्तव में आपकी समस्या (कोई OpenID) का समाधान नहीं है, लेकिन उपयोगी हो सकता है:

7

धन्यवाद, मुझे बहुत मदद! SessionRegistry के साथ, मैं सत्र में मौजूदा सक्रिय उपयोगकर्ताओं के साथ संशोधित करने के लिए उपयोगकर्ता की तुलना करने के लिए getAllPrincipals() का उपयोग कर सकता हूं। यदि कोई सत्र मौजूद है, तो मैं पुन: प्रमाणीकरण को मजबूर करने के लिए: expireNow() (SessionInformation से) का उपयोग कर अपने सत्र को अमान्य कर सकता हूं।

लेकिन मैं securityContextPersistenceFilter की उपयोगिता समझ में नहीं आता?

संपादित करें:

// user object = User currently updated 
// invalidate user session 
List<Object> loggedUsers = sessionRegistry.getAllPrincipals(); 
for (Object principal : loggedUsers) { 
    if(principal instanceof User) { 
     final User loggedUser = (User) principal; 
     if(user.getUsername().equals(loggedUser.getUsername())) { 
      List<SessionInformation> sessionsInfo = sessionRegistry.getAllSessions(principal, false); 
      if(null != sessionsInfo && sessionsInfo.size() > 0) { 
       for (SessionInformation sessionInformation : sessionsInfo) { 
        LOGGER.info("Exprire now :" + sessionInformation.getSessionId()); 
        sessionInformation.expireNow(); 
        sessionRegistry.removeSessionInformation(sessionInformation.getSessionId()); 
        // User is not forced to re-logging 
       } 
      } 
     } 
    } 
} 
+0

'डिफ़ॉल्ट रूप से securityContextPersistenceFilter'' 'HttpSession' में सर्वलेट वातावरण में रखा जाएगा SecurityContext'। जैसा कि आपके पास पहले से ही बॉक्स ऑफ स्प्रिंग 'सत्र रजिस्ट्री' है, आपको इस फ़िल्टर को कस्टमाइज़ करने की आवश्यकता नहीं है। – alexkasko

+0

मैं सर्वलेट पर्यावरण में हूं, सुरक्षा को अनुकूलित करने की उपयोगिता क्या है? कॉन्टैक्टपर्सिस्टेंसफिल्टर? – Aure77

+0

विभिन्न मामलों को संभव है, उदा। 'HttpSession की अक्षम हैं और आप थ्रेड-स्थानीय स्टोरेज नहीं चाहते हैं। तो आप 'securityContextRepository' के अपने कार्यान्वयन का उपयोग कर सकते हैं। यदि 'HttpSession' स्टोरेज आपकी आवश्यकताओं के अनुरूप है, तो कोई उपयोगीता नहीं है। – alexkasko

22

आप गतिशील रूप से उपयोगकर्ता के अधिकारियों में एक लॉग इन (जब इन जो भी कारण के लिए बदल दिया है,), लॉग आउट और निश्चित रूप से लॉग इन करने के बिना अद्यतन करना चाहते हैं, तो आप सिर्फ करने की जरूरत है वसंत SecurityContextHolder में Authentication ऑब्जेक्ट (सुरक्षा टोकन) को रीसेट करें।

उदाहरण:

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

List<GrantedAuthority> updatedAuthorities = new ArrayList<>(auth.getAuthorities()); 
updatedAuthorities.add(...); //add your role here [e.g., new SimpleGrantedAuthority("ROLE_NEW_ROLE")] 

Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(), auth.getCredentials(), updatedAuthorities); 

SecurityContextHolder.getContext().setAuthentication(newAuth); 
+5

ठीक है, यह लगभग मेरे लिए काम किया। यह "auth" चर लॉग इन उपयोगकर्ता (यानी, मुझे) से संबंधित है। अगर मैं "x" के रूप में लॉग इन हूं और मैं "y" अधिकारियों को निरस्त करना चाहता हूं, तो मैं उस विशिष्ट उपयोगकर्ता से प्रमाणीकरण की वस्तु कैसे प्राप्त करूं? – Paulo

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