2011-08-09 42 views
6

Tôi bắt đầu học Symfony 2 vào cuối tuần này. Tôi không gặp vấn đề gì, vì khung làm việc cũng được ghi lại trong quan điểm của tôi.FOSUserBundle và ACL Vai trò kinh doanh

Tôi đang sử dụng gói FOSUserBundle cho ACL. Tôi tự hỏi nếu nó có thể làm cho nó tương tự như khuôn khổ Yii:

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

Bạn có thể xem tất cả chi tiết về đoạn mã ở trên.

Tôi có thể đạt được điều gì đó tương tự với Symfony 2? Điều này có thể không?

+0

Nếu tôi hiểu chính xác, bạn muốn có thể hạn chế chỉnh sửa/cập nhật bài đăng cho tác giả của bài đăng đó? Tôi không quen thuộc với Yii, vì vậy tôi có thể chụp ảnh trong bóng tối ở đây. – Problematic

+0

@Problematic - Chính xác. Cách tiếp cận Yii ACL cho phép bạn cung cấp quy tắc kinh doanh (như được hiển thị trong đoạn trích trong câu hỏi của tôi). Nó tự động kiểm tra nếu id người dùng đã đăng nhập bằng authID - hoặc bất kỳ cột nào khác - của bài đăng được chọn từ cơ sở dữ liệu). Bạn có biết về chức năng tương tự trong Symfony 2 không? – users1184848

Trả lời

22

Symfony2 có một số ACL system ngoài hộp sẽ thực hiện việc này. Tôi bao gồm cả mã có liên quan vì lợi ích của sự hoàn chỉnh (sửa đổi cho Post thay vì Comment như là trong tài liệu):

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); 
    } 
} 

Về cơ bản, bạn đang đưa ra hiện đang đăng nhập quyền sở hữu sử dụng của đơn vị bài (bao gồm quyền chỉnh sửa). Và sau đó để kiểm tra xem người dùng hiện có quyền chỉnh sửa:

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 
    // ... 
} 

tôi cao khuyên bạn nên đọc qua cả Access Control ListAdvanced ACL Concepts công thức nấu ăn dạy nấu ăn để biết thêm thông tin. Việc tạo ra các ACL thực tế như đã trình bày ở trên là cực kỳ tiết kiệm, và tôi đã làm việc trên một số open-source ACL manager để giảm bớt nỗi đau ... nó "loại công việc;" đó là phiên bản beta đầu tiên và cần rất nhiều tình yêu, vì vậy hãy tự chịu rủi ro.

+0

Cảm ơn bạn đã trả lời. Tất cả mọi thứ là rõ ràng cho tôi bây giờ. – users1184848

+4

Nếu câu trả lời của tôi đã giúp bạn, vui lòng upvote và chấp nhận nó bằng cách sử dụng mũi tên và dấu kiểm ở gần đầu câu trả lời. Cảm ơn. – Problematic

Các vấn đề liên quan