2015-05-19 53 views
1

我已經成功在我的symfony2.3項目中安裝FOSComentBundle。 我已將FOSCommentBundle與FOSUserBundle集成,然後添加了基於角色的ACL安全性。我看到可以控制的操作是:create,view,delete,edit。 我想只顯示管理員的回覆按鈕,但我還沒有找到如何添加訪問角色的回覆事件。 這是我的配置文件:FOSCommentBundle訪問控制回覆,刪除和編輯評論

acl: true 
service: 
    acl: 
     thread: fos_comment.acl.thread.roles 
     comment: fos_comment.acl.comment.roles 
     vote: fos_comment.acl.vote.roles 
    manager: 
     thread: fos_comment.manager.thread.acl 
     comment: fos_comment.manager.comment.acl 
     vote: fos_comment.manager.vote.acl 
acl_roles: 
    comment: 
     create: IS_AUTHENTICATED_ANONYMOUSLY 
     view: IS_AUTHENTICATED_ANONYMOUSLY 
     edit: ROLE_ADMIN 
     delete: ROLE_ADMIN 
    thread: 
     create: IS_AUTHENTICATED_ANONYMOUSLY 
     view: IS_AUTHENTICATED_ANONYMOUSLY 
     edit: ROLE_ADMIN 
     delete: ROLE_ADMIN 
    vote: 
     create: IS_AUTHENTICATED_ANONYMOUSLY 
     view: IS_AUTHENTICATED_ANONYMOUSLY 
     edit: ROLE_ADMIN 
     delete: ROLE_ADMIN 

有,我必須覆蓋類?是否有任何文件的答覆按鈕?

回答

1

展望FOSCommentBundle後,我已經找到了解決我的問題:

1.首先,你有RoleCommentAcl覆蓋:通過創建命名ACL到MyBundle文件夾 。此文件夾中創建名爲RoleCommentAcl一個PHP類:

namespace MyProject\MyBundle\Acl; 

use FOS\CommentBundle\Acl\RoleCommentAcl as BaseRoleCommentAcl; 
use FOS\CommentBundle\Model\CommentInterface; 
use FOS\CommentBundle\Model\SignedCommentInterface; 
use Symfony\Component\Security\Core\SecurityContextInterface; 

class RoleCommentAcl extends BaseRoleCommentAcl { 

/** 
* The current Security Context. 
* 
* @var SecurityContextInterface 
*/ 
private $securityContext; 

/** 
* Constructor. 
* 
* @param SecurityContextInterface $securityContext 
* @param string     $createRole 
* @param string     $viewRole 
* @param string     $editRole 
* @param string     $deleteRole 
* @param string     $commentClass 
*/ 
public function __construct(SecurityContextInterface $securityContext, $createRole, $viewRole, $editRole, $deleteRole, $commentClass 
) { 
    parent::__construct(
      $securityContext, $createRole, $viewRole, $editRole, $deleteRole, $commentClass); 

    $this->securityContext = $securityContext; 
} 

/** 
* Checks if the Security token has an appropriate role to edit the supplied Comment. 
* 
* @param CommentInterface $comment 
* @return boolean 
*/ 
public function canEdit(CommentInterface $comment) { 
    // the comment owner can edit the comment whenever he want. 
    if ($comment instanceof SignedCommentInterface) { 
     if ($comment->getAuthor() == $this->securityContext->getToken()->getUser()) { 
      return true; 
     } 
    } 
    return parent::canEdit($comment); 
} 

/** 
* Checks if the Security token is allowed to delete a specific Comment. 
* 
* @param CommentInterface $comment 
* @return boolean 
*/ 
public function canDelete(CommentInterface $comment) { 
    // the comment owner can delete the comment 
    if ($comment instanceof SignedCommentInterface) { 
     if ($comment->getAuthor() == $this->securityContext->getToken()->getUser()) { 
      return true; 
     } 
    } 
    return parent::canDelete($comment); 
} 

/** 
* Checks if the Security token is allowed to reply to a parent comment. 
* 
* @param CommentInterface|null $parent 
* @return boolean 
*/ 
public function canReply(CommentInterface $parent = null) { 

    if ($parent instanceof SignedCommentInterface) { 
      //only the comment owner or the admin can reply to the comment. 
     if ($parent->getAuthor() == $this->securityContext->getToken()->getUser() || 
       $this->securityContext->isGranted('ROLE_ADMIN')) { 
      return true; 
     } 
    } 
    if($parent !=null) { 
     // if the user have no access to reply then return false. 
      return false; 
    } 
    //this ligne allow all users to post new comments. 
    return parent::canCreate(); 
} 

}

2.然後,你必須添加到services.xml的訪問權限:

<?xml version="1.0" ?> 

<container xmlns="http://symfony.com/schema/dic/services" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> 
<services> 
    <service id="myproject.name_bundle.acl.comment.roles" class="MyProject\MyBundle\Acl\RoleCommentAcl" public="false"> 
     <argument type="service" id="security.context" /> 
     <argument>IS_AUTHENTICATED_ANONYMOUSLY</argument> <!-- Create role --> 
     <argument>IS_AUTHENTICATED_ANONYMOUSLY</argument> <!-- View role --> 
     <argument>ROLE_ADMIN</argument> <!-- Edit role --> 
     <argument>ROLE_ADMIN</argument> <!-- Delete role --> 
     <argument>%fos_comment.model.comment.class%</argument> 
    </service> 
</services> </container> 

PS:如果您使用service.yml,則可以將此xml文件轉換爲yaml,但如果要使用services.xml要改變配置集合到你的包的DependencyInjection

$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); 
    $loader->load('services.xml'); 

打開你的頁面,你會發現,回覆將僅通過註釋的所有者和管理users.Also訪問的刪除和編輯可以只顯示評論所有者和管理員。