2011-09-20 17 views
11

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

क्या एसीएल केवल एक ही वस्तु के लिए उपयोगकर्ता/भूमिका के लिए अनुमति देता है या क्या यह पूरे प्रकार के लिए करता है? जैसा कि मैं इसे समझता हूं, domain object का अर्थ है लेकिन उदाहरण और ट्यूटोरियल ऐसा लगता है कि वे विशिष्ट वस्तुओं को अनुमतियां असाइन करते हैं। क्या मैं बस उलझन में हूं या क्या मैं दोनों कर सकता हूं? यदि नहीं, तो मैं दूसरे को कैसे करूं?

धन्यवाद!

उत्तर

24

वसंत-सुरक्षा के साथ आप दोनों ही कर सकते हैं। यह संभव है क्योंकि वसंत-सुरक्षा तथाकथित अनुमति नियमों का समर्थन करती है - वसंत-सुरक्षा शब्दावली के भीतर वे इसे अनुमति मूल्यांकनकर्ता कहते हैं। अनुमति नियम एसीएल को शामिल करते हैं, लेकिन जब आप किसी निश्चित स्थिति में होते हैं तो आप ऑब्जेक्ट्स के उदाहरण सुरक्षित कर सकते हैं ... आदि।

यह यह कैसे काम करता है: - यह आप अधिकारों का उपयोग निर्धारित करने के लिए सुपर कस्टम तर्क की अनुमति देता है -

  1. आप PermissionEvaluator बढ़ाने की जरूरत आप वस्तु के प्रकार की जांच या किसी विशेष के लिए जाँच कर सकते हैं आईडी, या यदि उपयोगकर्ता विधि लागू उपयोगकर्ता उस वस्तु, आदि .:

    public class SomePermissionsEvaluator implements PermissionEvaluator { 
        @Override 
        public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { 
         if (permission.equals("do_something") && 
         /*authentication authorities has the role A*/) { 
          return true 
         } else if (permission.equals("do_something_else") && 
         /*authentication authorities has the role B*/) { 
          return /*true if targetDomainObject satisfies certain condition*/; 
         } 
    
         return false; 
        } 
    
        @Override 
        public boolean hasPermission(Authentication authentication, 
         Serializable targetId, String targetType, Object permission) { 
        throw new UnsupportedOperationException(); 
        } 
    } 
    
  2. बनाया अब आप एक सुरक्षा नियम है कि है की जाँच करें, आप एनोटेशन के माध्यम से लागू करने की आवश्यकता:

    @PreAuthorize("hasRole('SOME_ROLE_OR_RIGHT') and" + 
    " hasPermission(#someDomainObject, 'do_something')") 
    public void updateSomeDomainObject(SomeDomainObject someDomainObject) { 
        // before updating the object spring-security will check the security rules 
    } 
    
  3. इस के लिए आदेश सुरक्षा एनोटेशन काम करने के लिए applicationContext.xml में सक्षम होना चाहिए:

    <global-method-security secured-annotations="enabled" pre-post-annotations="enabled"> 
        <expression-handler ref="expressionHandler"/> 
    </global-method-security> 
    
    <beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
        <beans:property name="permissionEvaluator"> 
         <beans:bean id="permissionEvaluator" class="com.npacemo.permissions.SomePermissionsEvaluator"/> 
        </beans:property> 
    </beans:bean> 
    
+0

आह, धन्यवाद त्वरित जवाब के लिए, नहीं सोचा था कि यह होगा 'AclPermissionEvaluator' कार्यान्वयन को देखते हुए PermissionEvaluator को कार्यान्वित करना इतना आसान है, जहां वे किसी प्रकार की 'ऑब्जेक्टइंडेंटिटी रीट्रिवल एसट्रेटी' का उपयोग करते हैं ... – Pete

+0

आपके पास दोनों सूची और कोड हाइलाइट हो सकते हैं, बस चार अतिरिक्त रिक्त स्थान जोड़ें। मैंने इस पोस्ट को उदाहरण के रूप में संपादित किया, स्रोत देखें। :) –

+0

अब मैं देखता हूं। आपका बहुत बहुत धन्यवाद! –

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