2013-07-01 6 views
10

मैं अपने वेब एप्लिकेशन को सुरक्षित करने के लिए अपाचे शिरो फ्रेमवर्क का उपयोग करने की कोशिश कर रहा हूं (यूआई वैडिन 6 पर आधारित है)। शिरो की साइट पर सभी उदाहरणों के माध्यम से देखा गया और घंटों तक भी गुगल रहा, लेकिन मुझे निम्नलिखित आवश्यकताओं से निपटने के लिए एक साफ रास्ता नहीं मिल रहा है।अपाचे शिरो का उपयोग करके पदानुक्रमित भूमिकाओं/अनुमतियों से कैसे निपटें?

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

 
Department A  - User is 'Manager' here 
Department B 
    Department C  - User is 'Admin' here 
    Department D 

उपयोगकर्ता में विभाग एक उपयोगकर्ता 'प्रबंधक' है भी विभाग डी (जो विभाग सी का पूर्वज है) के लिए 'व्यवस्थापक' भूमिका के वारिस चाहिए में विभाग सी उपयोगकर्ता 'व्यवस्थापक' है।

तो, बुनियादी अनुमति की जांच (यह मानते हुए मैं कुछ विभाग से संबंधित गतिविधि को देखना चाहते) होगा:

  1. जांच करें कि गतिविधि उपयोगकर्ता को देखने के लिए कोशिश कर रहा है उपयोगकर्ता विभाग के अंतर्गत आता है में एक भूमिका है,
  2. जांचें कि उपयोगकर्ता को इस विभाग में उनकी भूमिका पर अनुमति देने की आवश्यकता है।

मैं न केवल "सिस्टम व्यापक भूमिका", बल्कि "इस विशेष विभाग में भूमिका" को लागू करने के तरीके को समझने में फंस गया हूं।

मैं उपरोक्त उदाहरण को "स्ट्रिंग: व्यू: 123" जैसे अनुमति स्ट्रिंग में कैसे बदल सकता हूं? और मैं अपने व्यापार तर्क में अनुमति कैसे देखूँगा?

शिरो के साथ एक और संदेह कार्यान्वित किया गया है, मैं कुछ आउट ऑफ़ द बॉक्स समाधान का उपयोग करना चाहता हूं, जो मेरे स्वयं के कार्यान्वयन प्रदान करने के न्यूनतम प्रयास करेगा। हालांकि, ऐसा लगता है कि शिरो के अंतर्निहित कार्यान्वयन केवल साधारण मामलों के लिए डिज़ाइन किए गए हैं। क्या शुरू करने के लिए जटिल प्राधिकरण कार्यान्वयन का कोई उदाहरण है (जो उपरोक्त मामले को कवर कर सकता है)?

उत्तर

3

बस इस समस्या के समाधान का वर्णन करना चाहते हैं, जो किसी के लिए उपयोगी हो सकता है। मुझे लगता है कि यह इष्टतम नहीं हो सकता है, फिर भी क्लीनर कार्यान्वयन पर किसी भी सुझाव के लिए खुला है।

मान लिया जाये कि मैं निम्न क्रियाओं को सुरक्षित करने की जरूरत है:

  • गतिविधि: संपादित
  • गतिविधि: देखने

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

  • DEP_A: गतिविधि: देखने
  • DEP_C: गतिविधि: देखने
  • DEP_C: गतिविधि: हर बार जब मैं अगर कार्रवाई की जांच करना चाहते संपादित

कुछ गतिविधि के खिलाफ अनुमति है या नहीं, मैं जांच करने के लिए अनुमतियों की एक सूची बना रहा हूँ।उदाहरण:

गतिविधि ए विभाग डी से संबंधित है, मैं इसे 'देखना' चाहता हूं। जांच करने के लिए अनुमतियां हो जाएगा:

  • DEP_D: गतिविधि: देखने
  • DEP_C: गतिविधि: देखने
  • DEP_B: गतिविधि: देखने

अगर मैं विभाग में व्यवस्थापक हूँ सी, मैं करूंगा 'DEP_C: गतिविधि: देखें' अनुमति है और इसलिए चेक पास हो जाएगा। Thats कंपनी संरचना पदानुक्रम में अधिकार विरासत को लागू करने की अनुमति देता है।

यहाँ अनुमति जांच के लिए जिम्मेदार मेरी सेवा वर्ग से कोड snipplet है:

@Override 
    public void checkIfOperationPermitted(SecurityOperation operation, 
     Object object) 
    { 
     final Subject currentUser = SecurityUtils.getSubject(); 

     if(currentUser.isPermitted(
     SecurityOperation.SYSTEM_ADMIN.getPermissionString()) || 
     currentUser.hasRole("admin")) 
     { 
     // no need to check anything else, 
     // admin is system wide role. 
     return; 
     } 

     if(object instanceof Activity) 
     { 
     // Activity permissions fully depends on organization and 
     // product hierarchies. PermissionResolver is just a class 
     // which generates list of permission strings based on 
     // department activity is belonging to. 
     Activity a = (Activity) object; 
     List<String> permissionsToCheck = 
      permissionResolver.resolveHierarchicalPermissions(operation, a); 
     boolean permitted = false; 
     for(String permission: permissionsToCheck) 
     { 
      if(currentUser.isPermitted(permission)) 
      { 
       permitted = true; 
       break; 
      } 
     } 
     if(!permitted) 
     { 
      throw new UnauthorizedException("Access denied"); 
     } 
     } 
     else 
     { 
     // Check for system wide permissions 
     currentUser.checkPermission(operation.getPermissionString()); 
     } 
    } 

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

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