2012-08-28 10 views
5

मैं एक सिम्फनी 2 एप्लिकेशन में व्यस्त हूं जिसके लिए कुछ एसीएल अनुमतियां हैं।एकाधिक उपयोगकर्ताओं के लिए Symfony2 ACL एकाधिक ऑब्जेक्ट्स तक पहुंच

मैं सिम्फनी 2 के साथ एक नौसिखिया हूं, इसलिए सुनिश्चित नहीं है कि मैं इसे सही तरीके से देख रहा हूं।

मेरे पास एकाधिक ग्राहक हैं, जिनमें से प्रत्येक एक से अधिक खाते हैं।

मेरे पास एक सुपर व्यवस्थापक (ROLE_SUPER_ADMIN) है जिसके पास सभी क्लाइंट और सभी खातों तक पहुंच है। फिर मेरे पास एक व्यवस्थापक भूमिका (ROLE_ADMIN) है, जिसे केवल एक विशिष्ट ग्राहक और उन ग्राहकों के लिए सभी खातों तक पहुंच की अनुमति होगी। फिर एजेंट (ROLE_AGENT) हैं, जिनके पास केवल ग्राहकों के लिए कुछ खातों की अनुमति होनी चाहिए।

मैं सिम्फोनी डॉक्स, जो किसी विशेष वस्तु के लिए एक उपयोगकर्ता पहुँच प्रदान करने पर देखा था, मैं निम्नलिखित कोड का उपयोग कर सकते हैं: जब कोई नया खाता बनाने तो

// creating the ACL 
$aclProvider = $this->get('security.acl.provider'); 
$objectIdentity = ObjectIdentity::fromDomainObject($account); 
$acl = $aclProvider->createAcl($objectIdentity); 

// retrieving the security identity of the currently logged-in user 
$securityContext = $this->get('security.context'); 
$user = $securityContext->getToken()->getUser(); 
$securityIdentity = UserSecurityIdentity::fromAccount($user); 

// grant owner access  
$acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); 
$aclProvider->updateAcl($acl); 

, मैं दे सकता है वर्तमान में लॉग-इन नए बनाए गए खाते में उपयोगकर्ता का उपयोग। लेकिन मैं ग्राहक के अन्य सभी उपयोगकर्ताओं को खाते तक पहुंच कैसे प्रदान करूं?

मैं सभी उपयोगकर्ताओं के माध्यम से लूप नहीं करना चाहता हूं और प्रत्येक उपयोगकर्ता के लिए उपरोक्त कोड चलाऊंगा।

तो उदाहरण के लिए सभी ग्राहकों को देखते समय, मुझे यह जानने की ज़रूरत है कि उपयोगकर्ता के पास कौन से क्लाइंट हैं, या खातों को देखते समय, मुझे यह जानने की ज़रूरत है कि उपयोगकर्ता के पास कौन से खाते हैं।

क्लाइंट को नया उपयोगकर्ता जोड़ने के दौरान, उपयोगकर्ता को उस क्लाइंट के लिए स्वचालित रूप से सभी खातों तक पहुंच की आवश्यकता होती है।

एक साइड नोट के रूप में, मुझे केवल यह जानने की आवश्यकता है कि उपयोगकर्ता के पास खाता/ग्राहक तक पहुंच है या नहीं। यदि किसी उपयोगकर्ता के पास पहुंच है, तो उन्हें स्वचालित रूप से देखने/संपादित करने/हटाने आदि की अनुमति है

+2

यदि आपको विशिष्ट भूमिका में प्रत्येक उपयोगकर्ता को अनुमतियां असाइन करने की आवश्यकता है तो आपको इसके बजाय भूमिका-आधारित 'एसीएल' का उपयोग करना चाहिए ... जो कि खाता-आधारित समान है। मुझे कुछ उदाहरण कोड लिखने में सक्षम होना चाहिए (अगले कुछ घंटों में)। हालांकि यदि भूमिकाएं कुछ नहीं हैं, तो आप ** ** को प्रत्येक उपयोगकर्ता के माध्यम से पुन: प्रयास करने की आवश्यकता होगी जिसे आप अनुमति देना चाहते हैं .... –

उत्तर

0

इस मामले के लिए मैंने एक कस्टम सुरक्षा सेवा का उपयोग किया जो कई संस्थाओं के बीच कई संबंधों को सत्यापित करता है। यह आदर्श निर्णय नहीं है लेकिन ध्यान में रखें।

सबसे पहले हमें श्रोता बनाने की आवश्यकता है जो हर नियंत्रक कार्रवाई पर ट्रिगर किया जाएगा।

class SecurityListener 
{ 
    protected $appSecurity; 

    function __construct(AppSecurity $appSecurity) 
    { 
     $this->appSecurity = $appSecurity; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $c = $event->getController(); 

     /* 
     * $controller passed can be either a class or a Closure. This is not usual in Symfony2 but it may happen. 
     * If it is a class, it comes in array format 
     */ 
     if (!is_array($c)) { 
      return; 
     } 

     $hasAccess = $this->appSecurity->hasAccessToContoller($c[0], $c[1], $event->getRequest()); 

     if(!$hasAccess) { 
      throw new AccessDeniedHttpException('Access denied.'); 
     } 

    } 
} 

सेवा में हमारे पास अनुरोध, नियंत्रक उदाहरण और कार्रवाई कहा जाता है। इसलिए हम निर्णय ले सकते हैं कि उपयोगकर्ता का उपयोग हो या नहीं।

class AppSecurity 
{ 
    protected $em; 
    protected $security; 
    /** @var $user User */ 
    protected $user; 

    public function __construct(EntityManager $em, SecurityContext $security) 
    { 
     $this->em = $em; 
     $this->security = $security; 

     if($security->getToken() !== null && !$security->getToken() instanceof AnonymousToken) { 
      $this->user = $security->getToken()->getUser(); 
     } 
    } 

    /** 
    * @param $controller 
    * @param string $action 
    */ 
    public function hasAccessToContoller($controller, $action, Request $request) 
    { 
     $attrs = $request->attributes->all(); 
     $client = $attrs['client']; 

     /* db query to check link between logged user and request client */ 
    } 
} 

आप ParamConverter की तरह बहुत बुरा एनोटेशन उपयोग कर रहे हैं तो आप आसानी से अनुरोध से entites उपयोग के लिए तैयार निकाल सकते हैं।

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