2011-08-09 10 views
6

मैंने इस सप्ताह के अंत में सिम्फनी 2 सीखना शुरू कर दिया। मुझे कोई समस्या नहीं आई, क्योंकि ढांचे मेरी राय में अच्छी तरह से प्रलेखित है।एफओएसयूसर बंडल और एसीएल बिजनेस रोल

मैं एसीएल के लिए FOSUserBundle पैकेज का उपयोग कर रहा हूं। मैं सोच रहा हूँ अगर यह यह Yii ढांचे के समान बनाने के लिए संभव है:

$bizRule='return Yii::app()->user->id==$params["post"]->authID;'; 
$task=$auth->createTask('updateOwnPost','update a post by author himself',$bizRule); 
$task->addChild('updatePost'); 

आप उपरोक्त टुकड़ा पर सभी विवरण देख सकते हैं।

मैं सिम्फनी 2 के समान कुछ कैसे प्राप्त कर सकता हूं? क्या यह संभव है?

+0

यदि मैं सही ढंग से समझता हूं, तो आप उस पोस्ट के लेखक को एक पोस्ट के संपादन/अद्यतन को प्रतिबंधित करने में सक्षम होना चाहते हैं? मैं वाईआई से परिचित नहीं हूं, इसलिए मैं यहाँ अंधेरे में एक शॉट ले रहा हूं। – Problematic

+0

@Problematic - बिल्कुल। वाईआई एसीएल दृष्टिकोण आपको एक व्यापार नियम प्रदान करने की अनुमति देता है (जैसा कि मेरे प्रश्न में स्निपेट में दिखाया गया है)। यह लॉग इन उपयोगकर्ता आईडी स्वचालित रूप से जांचता है अगर डेटाबेस से चुने गए पोस्ट के authID - या किसी अन्य कॉलम के बराबर होता है)। क्या आप सिम्फनी 2 में समान कार्यक्षमता के बारे में जानते हैं? – users1184848

उत्तर

22

Symfony2 में बॉक्स के बाहर ACL system है जो ऐसा करेगा। मैं पूर्णता के लिए के लिए प्रासंगिक कोड शामिल कर रहा हूँ (Post बजाय Comment के लिए संशोधित रूप में दस्तावेज में है):

public function addPostAction() 
{ 
    $post = new Post(); 

    // setup $form, and bind data 
    // ... 

    if ($form->isValid()) { 
     $entityManager = $this->get('doctrine.orm.default_entity_manager'); 
     $entityManager->persist($post); 
     $entityManager->flush(); 

     // creating the ACL 
     $aclProvider = $this->get('security.acl.provider'); 
     $objectIdentity = ObjectIdentity::fromDomainObject($post); 
     $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); 
    } 
} 

अनिवार्य रूप से, आप दे रहे हैं वर्तमान में पोस्ट इकाई के उपयोगकर्ता स्वामित्व में लॉग इन (जिसमें संपादन अनुमतियां शामिल हैं)। और फिर यदि वर्तमान उपयोगकर्ता को संपादित करने की अनुमति है की जाँच करने के:

public function editPostAction(Post $post) 
{ 
    $securityContext = $this->get('security.context'); 

    // check for edit access 
    if (false === $securityContext->isGranted('EDIT', $post)) 
    { 
     throw new AccessDeniedException(); 
    } 

    // retrieve actual post object, and do your editing here 
    // ... 
} 

मैं अत्यधिक सुझाव है कि आप अधिक जानकारी के लिए दोनों Access Control List और Advanced ACL Concepts रसोई की किताब व्यंजनों के माध्यम से पढ़ें। उपरोक्त दिखाए गए एसीएल की वास्तविक सृजन अत्यंत वर्बोज़ है, और मैं दर्द को कम करने के लिए open-source ACL manager पर काम कर रहा हूं ... यह "काम करता है;" यह शुरुआती बीटा है और बहुत प्यार की जरूरत है, इसलिए अपने जोखिम पर उपयोग करें।

+0

उत्तर के लिए धन्यवाद। सब कुछ मेरे लिए अब स्पष्ट है। – users1184848

+4

यदि मेरे उत्तर ने आपकी मदद की है, तो कृपया उत्तर के शीर्ष के पास तीरों और चेकमार्क का उपयोग करके इसे मुक्त करने और इसे स्वीकार करने के लिए स्वतंत्र महसूस करें। धन्यवाद। – Problematic

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