2009-05-21 14 views
19

मैं वसंत-सुरक्षा ढांचे का उपयोग कर रहा हूं। जब मैं अनुमतियां अपडेट करता हूं, तो यह तुरंत प्रभावी नहीं होता है। मुझे वर्तमान उपयोगकर्ता (मतलब लॉगआउट) छोड़ना है, और फिर फिर से विज़िट करना (मतलब लॉगिन) अपडेट करना होगा उपयोगकर्ता की अनुमतिवसंत सुरक्षा में उपयोगकर्ता प्राधिकरण को अद्यतन करने के बाद तुरंत प्राधिकरण को कैसे सक्षम करें?

एक ऐसा तरीका है जो वसंत सुरक्षा में अद्यतन उपयोगकर्ता प्राधिकरण के तुरंत बाद प्राधिकरण को सक्षम करता है?

+0

एक संभावित समाधान का वर्णन किया गया है [वास्तविक समय में सुरक्षित सत्र समायोजित करना] (http://spring.io/blog/2009/01/03/spring-security-ustomization-part-2- समायोजन- सुरक्षित- सत्र- इन-रीयल-टाइम) स्प्रिंग सोर्स ब्लॉग पर पोस्ट करें। – Karimchik

+0

इसमें कुछ समय लगा, लेकिन मुझे लगता है कि अंत में यह पता चला था: http://stackoverflow.com/q/23072235/42962 – hooknc

उत्तर

0

जब से तुम काफी अपने प्रश्न में सटीक विवरण प्रदान नहीं किया, मुझे लगता है कि आप एक स्थिति है जहाँ है:

  1. आप एक UserDetails लोड करने के लिए जब कोई उपयोगकर्ता के लिए लॉग इन करने के लिए प्रयास करता है
  2. एक UserDetailsService आपूर्ति कर रहे हैं
  3. उस सेवा के एक हिस्से के रूप में, आप किसी उपयोगकर्ता की अनुमतियों के बारे में विवरण लोड करने के लिए डेटाबेस/डीएओ से पूछताछ कर रहे हैं, और
  4. पर आधारित प्राधिकरणों को सेट कर रहे हैं, जब आप कहते हैं कि "जब मैं अनुमतियां अपडेट करता हूं" तो आप हैं डेटाबेस में उपयोगकर्ता की अनुमतियों को अपडेट करने का जिक्र करते हुए (या जो भी आप डेटा संग्रहित कर रहे हैं)।

यदि ऐसा है तो आप जो डिज़ाइन देख रहे हैं वह डिज़ाइन द्वारा है - स्प्रिंग सिक्योरिटी केवल उपयोगकर्ता के लिए उपयोगकर्ता के विवरण लोड करती है, जब वे लॉगिन करने का प्रयास करते हैं, और उसके बाद सत्र में इसे स्टोर करते हैं। आम तौर पर यह समझ में आता है, क्योंकि यह एप्लिकेशन को प्रत्येक अनुरोध पर उपयोगकर्ता विवरण के बारे में समान प्रश्न करने से रोकता है। साथ ही, उपयोगकर्ता की अनुमतियां आम तौर पर 99.9% यात्राओं में नहीं बदलती हैं।

इस व्यवहार को बदलने के लिए, आप कहीं भी "रीफ्रेश" कमांड/पेज जोड़ना चाहते हैं जो कुछ कोड (जिसे आपको लिखना होगा) ट्रिगर करेगा जो UserDetailsService को दोबारा पूछेगा और UserDetails को सुरक्षा कॉन्टेक्स्ट में बदल देगा । मुझे विश्वास नहीं है कि ऐसा करने के लिए कोई अंतर्निहित तरीका है।

+0

आपकी धारणा सही है। मैं जानना चाहता हूं कि ऐसा करने के बिना ऐसा करने के कोई अच्छे तरीके हैं पुनः लॉगिन करने के लिए। शायद मैं वर्तमान उपयोगकर्ता में संग्रहीत उपयोगकर्ता अनुमतियों को संशोधित कर सकता हूं। मैं कोशिश कर रहा हूं .. –

0

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

3

Gandalf समाधान मान्य है लेकिन पूरा नहीं हुआ है। वसंत सुरक्षा द्वारा नई अनुमतियों पर विचार करने के लिए (उदाहरण के लिए पहले उपलब्ध पृष्ठों तक पहुंच की अनुमति दें), आपको अधिकारियों की नई सूची वाली एक नई प्रमाणीकरण वस्तु (उदाहरण के लिए नया उपयोगकर्ता नाम पासवर्डवर्ड प्रमाणीकरण टोकन) बनाना होगा।

7

आप alwaysReauthenticate सेट कर सकते हैं में अपने AbstractSecurityInterceptor इस

<bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor"> 
     <property name="alwaysReauthenticate" value="true"/> 
... 
</bean> 

बेशक आप ध्यान देना चाहिए क्योंकि 99,9% आप पुन: प्रमाणीकरण की जरूरत नहीं है की तरह। चूंकि प्रमाणीकरण डेटाबेस का उपयोग कर सकता है या कुछ और आपका प्रदर्शन खराब हो सकता है। लेकिन आम तौर पर आपके पास कैश होता है, जैसे कि हाइबरनेट के साथ दूसरे स्तर की तरह, इसलिए प्रत्येक बार उपयोगकर्ता विवरण लोड करना सभी मामलों में केवल स्मृति ऑपरेशन होना चाहिए जहां अधिकारियों ने बदला नहीं है।

+1

यदि मैं सेम पर विधियों को सुरक्षित करना चाहता हूं, तो क्या मुझे एक ही फ़िल्टर में एक ही बदलाव करने की ज़रूरत है, या यह है पर्याप्त? –

+1

यह फ़िल्टर केवल वेब अनुरोध के लिए है जहां तक ​​मैं देखता हूं। यदि आप MEthodSecurityInterceptor का उपयोग कर रहे हैं तो आप अपने आप को पुनः प्रमाणित कर सकते हैं। लेकिन अगर इस विधि को चेक करके प्रत्येक विधि कॉल पहले किया गया है क्योंकि प्रत्येक विधि कॉल कुछ हद तक http अनुरोध के अंदर है तो आपको ठीक होना चाहिए – Janning

+0

यह सही उत्तर है। मैं केवल यह जोड़ना चाहता हूं कि किसी को इस कॉन्सेप्टर को सुरक्षा कॉन्फ़िगरेशन में ' ' अनुभाग या इंटरसेप्टर संपत्ति द्वारा:' < संपत्ति नाम = "securityMetadataSource"> <सेकंड: फिल्टर-सुरक्षा-मेटाडाटा स्रोत> <सेकंड: अवरोधन-यूआरएल ढांचा = "/ **" पहुँच = "isAuthenticated()" /> ' –

-2

आप कोशिश कर सकते हैं इस

SecurityContextHolder.getContext().setAuthentication(SecurityContextHolder.getContext().getAuthentication()); 
+1

मैं इस कोड की कोशिश की , लेकिन दुर्भाग्य से इसका कोई प्रभाव नहीं पड़ा। – chelder

2

थ्रेड स्थानीय संदर्भ रीसेट करने के लिए पर्याप्त नहीं है, आप भी सत्र अद्यतन करने की आवश्यकता:

UserContext userContext = (UserContext) context.getAuthentication().getPrincipal(); 
if (userContext != null && userContext.getUsername() != null) { 
    //This is my function to refresh the user details 
    UserDetailsBean userDetails = getUserDetailsBean(userContext.getUsername()); 
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    if (authentication instanceof UsernamePasswordAuthenticationToken) { 
     UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) authentication; 
     auth.setDetails(userDetails); 
    } 
    return userDetails; 
} else { 
    throw new ServiceException("User not authenticated"); 
} 
request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext()); 

कम से कम गूगल में सत्र AppEngine है नहीं एक संदर्भ और थ्रेड स्थानीय को संशोधित करके स्वचालित रूप से अपडेट नहीं होता है, आपको मैन्युअल रूप से सत्र करना होगा। अपनी ऑब्जेक्ट को सेट करें।

+0

यह सत्र विशेषताओं को अपडेट करने में भी काम नहीं करता था –

1

निम्नलिखित धागा बताते हैं कि कैसे अपने उपयोगकर्ता/प्राचार्य हर अनुरोध को फिर से लोड करने के लिए:

Reload UserDetails Object from Database Every Request in Spring Security


पूर्ण प्रकटीकरण मैं सवाल और ऊपर के लिंक में सवाल का जवाब के लेखक हूँ।

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