2009-12-17 17 views
6

मैं उपयोगकर्ता, समूह और अनुमतियों को प्रबंधित करने के लिए वसंत सुरक्षा का उपयोग करना चाहता हूं।वसंत सुरक्षा पर समूह और एसीएल

मैं अपने डोमेन ऑब्जेक्ट्स को सुरक्षित करने के लिए एसीएल का उपयोग करना चाहता हूं लेकिन मुझे समूह को एसीएल को असाइन करने का कोई तरीका नहीं मिल रहा है।

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

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

मैं यह कैसे कर सकता हूं?

मैं वसंत सुरक्षा डॉक्स और निम्नलिखित ट्यूटोरियल (ताकि कृपया मुझे इन कड़ियों को न भेजें) पढ़ें: http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html http://blog.denksoft.com/?page_id=20

उत्तर

14

स्प्रिंग सुरक्षा 3.0 की जांच करें, आप स्प्रिंग एक्सप्रेशन भाषा का उपयोग कर एसीएल का उपयोग करने से बचने में सक्षम हो सकते हैं।

@PreAuthorize("hasRole('ROLE_FORUM_MANAGER') and hasPermission(#forum,'update')) 
public void updateForum(Forum forum) { 
    //some implementation 
} 

फिर आप एक कस्टम अनुमति मूल्यांकनकर्ता में hasPermission विधि लागू करेगा की तरह:

public class ForumPermissionEvaluator implements PermissionEvaluator { 

    public boolean hasPermission(Authentication authentication, 
      Object domainObject, Object permission) { 
     //implement 
    } 

    public boolean hasPermission(Authentication authentication, 
      Serializable targetId, String targetType, Object permission) { 
     //implement 
    } 
} 

उदाहरण के लिए, एक मंच संपादित करने के लिए, आप एक विधि इस तरह सुरक्षित होता है अंत में, इसे एप्लिकेशन कॉन्फ़िगरेशन में एक साथ तार करें:

<beans:bean id="expressionHandler" 
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <beans:property name="permissionEvaluator" ref="permissionEvaluator"/> 
</beans:bean> 

<beans:bean id="permissionEvaluator" 
    class="com.centrix.core.security.GroupPermissionEvaluator" /> 
+0

हाँ मैंने इसे पहले देखा है, लेकिन वसंत सुरक्षा 3 आधिकारिक रिलीज नहीं है, इसलिए मैं इसका उपयोग नहीं करता, लेकिन मुझे लगता है कि मैं इसका उपयोग करने के लिए थोड़ा इंतजार करूंगा। –

+0

"#forum" जैसे विधियों के तर्कों का उपयोग करके ऐसा करने के लिए आपको अपने उत्पादन JARs में डिबग जानकारी छोड़नी होगी .... शायद एक अच्छा विचार नहीं है। – HDave

+0

बीन वायर-अप में, क्या अंतिम तत्व 'GroupPermissionEvaluator' के बजाय 'ForumPermissionEvaluator' होना चाहिए? एक और सवाल: यदि आप एक से अधिक अनुमति एवल्यूलेटर चाहते हैं, तो उसे कैसे तारित किया जाएगा, क्योंकि केवल एक अभिव्यक्ति हैडलर? –

1

मैं इसी तरह की 'मैन्युअल' कुछ किया: यानी मैं करने के लिए अपने खुद के कोड था यह निर्धारित करें कि किसी विशिष्ट उपयोगकर्ता द्वारा कौन से उदाहरण संपादित/हटाए जा सकते हैं और केवल यह सुनिश्चित करने के लिए स्प्रिंग सुरक्षा पर भरोसा किया गया है कि उनके पास कार्यक्षमता तक पहुंचने और वर्तमान उपयोगकर्ता के लिए भूमिका/प्रमाणीकरण जानकारी प्रदान करने की सही भूमिका है।

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

public static User getCurrentUser() { 
    User user = null; 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null) { 
     Object principal = auth.getPrincipal(); 
     if (principal instanceof User) { 
      user = (User)principal; 
     } 
    } 
    return user; 
} 
+0

लेकिन मुझे समझ में नहीं आता कि आप कैसे आवेदन करते हैं आपके मामले में एक समूह के लिए एक एसीएल? –

+0

मैं वास्तव में एसीएल का उपयोग नहीं करता हूं, लेकिन समूह और उपयोगकर्ता दोनों संस्थाएं हैं और एक (द्वि-दिशात्मक) संबंध (हाइबरनेट द्वारा प्रबंधित) है। यह निर्धारित करने के लिए कि क्या उपयोगकर्ता समूह पर विशेष क्रियाएं कर सकता है, मैं जांचता हूं कि वर्तमान प्रिंसिपल उस समूह का मॉडरेटर है (यानी समूह उपयोगकर्ता के 'मॉडरेट' संग्रह में निहित है)। इसलिए प्रत्येक समूह के मॉडरेटर की सूची मूल रूप से उस समूह के लिए 'एसीएल' है और यह डेटाबेस में प्रबंधित है, वसंत सुरक्षा कॉन्फ़िगरेशन में नहीं। –

2

मैं सिर्फ आपके समूह जैसे भूमिकाओं का उपयोग करूंगा। मुझे स्प्रिंग एसीएल कार्यान्वयन बहुत अनावश्यक और अधिकांश भाग के लिए अनुपयोगी पाया गया है। बस उपयोगकर्ताओं को "समूह" (सभी वास्तविकता में भूमिकाएं) को असाइन करें और उन्हें जांचें क्योंकि आप सामान्य भूमिका आधारित प्राधिकरण करेंगे।

+0

इसलिए मैं गतिशील रूप से "GROUP_15" जैसे प्राधिकरण को बना सकता हूं और इसके बाद, GrantedAuthoritySid ("GROUP_15") के साथ फोरम 75 एसीएल में जोड़ें। यदि मैं ऐसा कर सकता हूं, तो यह मेरे लिए अच्छा है। लेकिन मुझे गतिशील रूप से सभी भूमिकाएं और अनुमतियां बनाने की आवश्यकता है। –

+0

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

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