2010-02-18 12 views
6

मैं SecurityContextHolder का उपयोग करें और एक कस्टम UserDetailsServiceSecurityContextHolder से UserDetails प्राप्त करने के लिए:सुरक्षाContextHolder धागा सुरक्षित है?

Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
UserDetailsDTO user = (UserDetailsDTO) o; 

मैं अशक्त चेक, आदि बाहर छोड़ दिया है, लेकिन यह विचार है। मैं एक @Aspect के @Around pointcut में यह उपयोग कर रहा हूँ:

@Around("execution(* user.service.*.*(..))") 
public Object audit(ProceedingJoinPoint call) throws Throwable { 
    // get user id 
    // add audit row in db 
} 

SecurityContextHolder वर्ग को देखते हुए, यह डिफ़ॉल्ट रूप से एक ThreadLocal का उपयोग करता है, लेकिन pointcut सामान भी समझाया सूत्रण तर्क न किसी तरह का लगता है।

क्या यह संभव है कि उपयोगकर्ता टकराव हो सकता है (यानी किसी अन्य समवर्ती सत्र में उपयोगकर्ताबी ऑडिट ईवेंट के लिए एक सत्र से उपयोगकर्ता ए तक पहुंचें), या संभवतः एक शून्य उपयोगकर्ता पूरी तरह से।

क्या प्रमाण-पत्र/उपयोगकर्ता प्रोफ़ाइल प्राप्त करने का कोई बेहतर तरीका है?

उत्तर

5

हां, यह डिफ़ॉल्ट रणनीति (MODE_THREADLOCAL) के साथ थ्रेड सुरक्षित है (जब तक आप फ्लाई पर रणनीति को बदलने की कोशिश नहीं करते)। हालांकि, यदि आप पैरेंट थ्रेड के SecurityContext को उत्तराधिकारी बनाने के लिए तैयार धागे चाहते हैं, तो आपको MODE_INHERITABLETHREADLOCAL सेट करना चाहिए।

इसके अलावा पहलुओं में कोई "थ्रेडिंग तर्क" नहीं है, उन्हें सलाह दी गई विधि के समान थ्रेड पर निष्पादित किया जाता है।

+0

मैंने देखा कि, लेकिन आदमी ऐसा लगता है कि वसंत लोगों के लिए एक विशाल मिस्की है। एक स्थैतिक उपयोग वर्ग, और setStrategyName में यह जावाडोक ब्लर्ब है: 'किसी दिए गए जेवीएम के लिए इस विधि को एक से अधिक बार कॉल न करें, क्योंकि यह रणनीति को फिर से शुरू करेगा और पुराने रणनीति का उपयोग करके किसी भी मौजूदा धागे को प्रतिकूल रूप से प्रभावित करेगा।' मुझे लगता है कि मैं शायद एक सिंगलटन रैपर वर्ग बनाने के अंत में। – Droo

+0

मुझे लगता है कि एक सिस्टम प्रॉपर्टी भी है: 'सार्वजनिक स्थैतिक अंतिम स्ट्रिंग SYSTEM_PROPERTY = "spring.security.strategy"; ' – Droo

-1

हां यह धागा सुरक्षित है। आपको बस सुरक्षाContextHolder.getContext() प्राप्त करना चाहिए। GetAuthentication()। GetName()

+0

डाउनवोट के कारण कृपया – vsingh

1

सामान्य रूप से, थ्रेडलोकल वैश्विक कैश्ड थ्रेड पूल में मित्रवत नहीं होगा। एक निष्पादक सेवा का डिफ़ॉल्ट कैश किए गए थ्रेड पूल (एक्जिक्यूटर्स.न्यूकैच किए गए थ्रेडपूल()) में प्रारंभिक थ्रेड के थ्रेडलोकल स्टोरेज या रिक्त स्थान होंगे। इस स्थिति में, MODE_INHERITABLETHREADLOCAL सेटिंग कुछ भी नहीं बदलेगी, जब तक कैश किए गए थ्रेडपूल प्रति अनुरोध प्रारंभ नहीं किया जाता है, जो इसका बहुत बुरा उपयोग होगा .. सुनिश्चित करें कि कोई अंतर्निहित ढांचे या पुस्तकालय निष्पादक का उपयोग नहीं कर रहे हैं। NewCachedThreadPool() आपके लिए धागा पूलिंग।

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