2011-06-20 19 views
57

क्या उपयोगकर्ता प्रधानाचार्य मैं SecurityContextHolder से अनुरोधों या सत्रों के लिए बाध्य हूं?स्प्रिंग सुरक्षा की सुरक्षा कॉन्टेक्स्टहोल्डर: सत्र या अनुरोध बाध्य?

UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

इस तरह से मैं का उपयोग वर्तमान में उपयोगकर्ता के प्रवेश है। यदि मौजूदा सत्र नष्ट हो गया है तो क्या यह अमान्य होगा?

उत्तर

102

यह इस बात पर निर्भर करता है कि आपने इसे कैसे कॉन्फ़िगर किया है (या कहें, आप एक अलग व्यवहार को कॉन्फ़िगर कर सकते हैं)।

वेब अनुप्रयोग में आप ThreadLocalSecurityContextHolderStrategy का उपयोग करेंगे जो SecurityContextPersistenceFilter के साथ इंटरैक्ट करता है।

जावा के साथ शुरू होता है SecurityContextPersistenceFilter के डॉक्टर:

कॉन्फ़िगर किया गया से प्राप्त जानकारी के साथ {@link SecurityContextHolder} {भरता @link SecurityContextRepository} पहले अनुरोध और यह भंडार पीठ में करने के लिए अनुरोध के बाद भंडार संदर्भ धारक को पूरा और साफ़ कर रहा है। डिफ़ॉल्ट रूप से यह {@link HttpSessionSecurityContextRepository} का उपयोग करता है। जानकारी के लिए इस कक्षा को देखें HttpSession संबंधित कॉन्फ़िगरेशन विकल्प।

Btw:

  • HttpSessionSecurityContextRepository HttpSession (कुंजी = "का उपयोग करता है: HttpSessionSecurityContextRepository SecurityContextRepository का ही कार्यान्वयन (मैं डिफ़ॉल्ट libs में पाया है)

    यह इस तरह काम करता है SPRING_SECURITY_CONTEXT ") SecurityContext ऑब्जेक्ट को स्टोर करने के लिए।

  • SecurityContextPersistenceFilter एक फ़िल्टर है जो SecurityContextRepository का उपयोग करता है उदाहरण के लिए HttpSessionSecurityContextRepositorySecurityContext ऑब्जेक्ट्स लोड और स्टोर करने के लिए। एक HttpRequest फिल्टर गुजरता है, फिल्टर रिपोजिटरी से SecurityContext हो और SecurityContextHolder (SecurityContextHolder#setContext)
  • SecurityContextHolder दो तरीकों setContext और getContext है में रख दें। सेट- और get-Context विधियों में वास्तव में क्या किया जाता है यह निर्दिष्ट करने के लिए दोनों SecurityContextHolderStrategy का उपयोग करते हैं। - उदाहरण के लिए ThreadLocalSecurityContextHolderStrategy संदर्भ को संग्रहीत करने के लिए एक थ्रेड स्थानीय का उपयोग करता है।

तो संक्षेप में: उपयोगकर्ता प्रिंसिपल (सुरक्षा कॉन्टेक्स्ट का तत्व) HTTP सत्र में संग्रहीत है। और प्रत्येक अनुरोध के लिए इसे एक थ्रेड स्थानीय में रखा जाता है जहां से आप इसे एक्सेस करते हैं।

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