2009-01-17 16 views
5

मैं एक वेबपैप सुरक्षित करने के लिए वसंत सुरक्षा का उपयोग कर रहा हूं। यूआरएल इस तरह सुरक्षित हैं:मैं कैसे निर्धारित कर सकता हूं कि वसंत सुरक्षा वाले यूआरएल तक पहुंचने के लिए कौन सी भूमिकाएं आवश्यक हैं?

<security:http entry-point-ref="authenticationEntryPoint"> 
    <security:intercept-url pattern="/" access="ROLE_ANONYMOUS" /> 
    <security:intercept-url pattern="/assets/**/*" access="ROLE_ANONYMOUS" /> 
    ... 
    <security:intercept-url pattern="/**" access="ROLE_USER" /> 
    <security:anonymous granted-authority="ROLE_ANONYMOUS" /> 
</security:http> 

मैं एक फिल्टर कुछ निश्चित परिस्थितियों में एक विशेष पृष्ठ के लिए उपयोगकर्ता अनुप्रेषित करने की जरूरत है कि है। हालांकि, उस पृष्ठ को संपत्ति निर्देशिका में छवियों और सीएसएस फ़ाइलों की आवश्यकता होती है जो दुर्भाग्यवश भी उस विशेष पृष्ठ पर रीडायरेक्ट की जाएगी। मैं नहीं चाहता कि फिल्टर प्रत्येक यूआरएल पैटर्न के खिलाफ मैन्युअल रूप से जांच करे क्योंकि मेरा वास्तविक यूआरएल कॉन्फ़िगरेशन बहुत लंबा है, और मैं अन्य पृष्ठों को भी अनुमति देना चाहता हूं।

क्या किसी दिए गए पृष्ठ के लिए फ़िल्टर से निर्धारित करने का कोई तरीका है कि भूमिकाओं की क्या आवश्यकता है? यदि ROLE_ANONYMOUS की आवश्यकता नहीं है तो मैं पुनर्निर्देशित नहीं करना चुन सकता।

उत्तर

2

यह न भूलें कि वास्तव में क्या होता है यह तय करते समय क्या होता है कि यूआरएल और मौजूदा प्रमाणीकरण AccessDecisionVoter एस की श्रृंखला के माध्यम से पारित किया गया है, जिसमें से एक डिफ़ॉल्ट RoleVoter है। यह मतदाता अनुरोधित संसाधन के लिए कॉन्फ़िगरेशन की जांच करता है, और यदि कोई विशिष्ट भूमिका आवश्यक है, तो मौजूदा प्रमाणीकरण में उस भूमिका के लिए अनुरोध से इनकार नहीं किया जाएगा।

तो समाधान के लिए - आप अन्य मतदाताओं को जोड़ सकते हैं जो भूमिका मतदाता से पहले लात मारते हैं। प्रत्येक मतदाता को अनुदान, डेनी या अबाउटन लौटा देना चाहिए, और प्रोस्टिंग केवल बाद के मतदाताओं के लिए जारी रहता है अगर अस्टेन लौटाया जाता है। इस प्रकार आप अपना खुद का कस्टम मतदाता लिख ​​सकते हैं (या यदि यह काम करेगा तो मौजूदा व्यक्ति का पुन: उपयोग करें), इसे भूमिका मतदाता से पहले आग लगाना है, और बिना शर्त संसाधनों के किसी भी अनुरोध तक पहुंच प्रदान करना है जिसका आप उल्लेख कर रहे हैं।

मैंने वर्तमान प्रोजेक्ट में ऐसा कुछ किया है, जहां कुछ क्षणिक एप्लिकेशन-विशिष्ट विशेषताएं किसी को ऐसे संसाधनों तक पहुंचने दे सकती हैं जो आम तौर पर वे सक्षम नहीं होंगे, और यह एक दृष्टिकोण के रूप में अच्छी तरह से काम करती है।

+0

एक अच्छा विचार है कि है, लेकिन यह काफी मुझे वहाँ नहीं मिलता है। समस्या यह है कि, इस पर ध्यान दिए बिना कि उपयोगकर्ता के पास पहुंच है या नहीं, फ़िल्टर उस विशेष पृष्ठ पर क्लिक करता है और रीडायरेक्ट करता है। मुझे फिल्टर के बारे में जानने के लिए कुछ तरीका चाहिए जब इसे रीडायरेक्ट नहीं किया जाना चाहिए, और यूआरएल के लिए आवश्यक भूमिकाओं को जानना ऐसा होगा। –

3

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

नामस्थान द्वारा निर्मित आंतरिक सेम का संदर्भ प्राप्त करना थोड़ा मुश्किल हो सकता है। मान लिया जाये कि आप अपने खुद के सेम (या सेम) जिससे आपको कॉल बनाना चाहते है, तो आप अपने आवेदन संदर्भ है, जो कुछ इस तरह कार्यान्वित किया जाता है के लिए एक BeanPostProcessor जोड़कर उन्हें को इसकी सुई कर सकते हैं:

public class FilterSecurityMDSExtractor implements BeanPostProcessor, BeanFactoryAware { 
    private ConfigurableListableBeanFactory bf; 

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     if (bean instanceof FilterInvocationSecurityMetadataSource) { 
      // Get your own bean from the BeanFactory here and inject the SecurityMetadataSource into it 
     } 
     return bean; 
    } 

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    }  

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
     this.bf = (ConfigurableListableBeanFactory)beanFactory; 
    } 
} 

ध्यान दें कि स्प्रिंग सिक्योरिटी स्वचालित रूप से संदर्भ में WebInvocationPrivilegeEvaluator को पंजीकृत करती है जिसका उपयोग यह जांचने के लिए किया जा सकता है कि उपयोगकर्ता के पास वास्तव में इसका उपयोग किए बिना किसी विशेष URL को आमंत्रित करने की क्षमता है या नहीं। यह समान है, जिसमें यह सुरक्षा मेटाडेटा स्रोत से पूछताछ करता है, लेकिन इसके बाद आप जो कुछ भी कर रहे हैं उसके बारे में नहीं।