2016-07-25 109 views
2

我在Symfony 3中基于角色&权限构建管理控制台。每个管理员将被分配一个角色(或多个角色),然后他将能够根据分配给该角色的权限执行操作。管理角色并将权限分配给角色 - Symfony


为了给你一个想法,这里有一个例子:

  • 管理面板添加用户,编辑和删除用户的功能。
  • 我创建了一个角色:USER_MANAGEMENT_WITHOUT_DELETE其中有user_createuser_edit的权限。
  • 我创建USER_MANAGEMENT_WITH_DELETE角色,其有权user_createuser_edituser_delete
  • 所以现在,管理员与角色USER_MANAGEMENT_WITH_DELETE可以addeditdelete,其中与角色admin USER_MANAGEMENT_WITHOUT_DELETE只能addedit用户,但不能删除用户。

我搜索,发现了FOSUserBundleACL。有些recommended ACL也有人说这是更好地use FOSUserBunder

我也看了FOSUserBunder的文件,以及它如何存储在角色列roles,像a:1:{i:0;s:10:"ROLE_ADMIN";},但有关权限只字不提。所以这里是我的查询:

  1. 我很困惑这两者之间。我应该使用哪一个?
  2. 如果我使用FOSUserBunder,如何管理权限?

回答

3

角色不是特定的tu FOSUserBundle。他们在Symfony。

ACLs比使用角色更复杂。所以我会建议使用角色。

从Symfony的文档: 替代的ACL

使用ACL的是不平凡的,以及更简单的使用情况,也可能是 矫枉过正。如果您的许可逻辑可以通过编写 某些代码(例如,以检查博客是否由当前用户拥有)来描述,那么 考虑使用选民。选民通过被投票的对象 ,您可以使用该对象进行复杂决策并有效实施您自己的ACL的 。强制授权(例如isGranted部分) 看起来与您在本条目中看到的内容类似,但您的选民类将 处理幕后逻辑,而不是ACL系统。

为了应对 '权限',我会sugget使用Voters

首先创建这样一个选民:

配置:

# app/config/services.yml 
services: 
    app.user_permissions: 
     class: AppBundle\Voters\UserPermissionsVoter 
     arguments: ['@security.access.decision_manager'] 
     tags: 
      - { name: security.voter } 
     public: false 

和类:

namespace AppBundle\Voters; 

use Symfony\Component\Security\Core\Authorization\Voter\Voter; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\User\UserInterface; 

class UserPermissionsVoter extends Voter 
{ 
    const USER_CREATE = 'user_create'; 
    const USER_EDIT = 'user_edit'; 
    const USER_DELETE = 'user_delete'; 

    private $decisionManager; 

    public function __construct($decisionManager) 
    { 
     $this->decisionManager = $decisionManager; 
    } 

    protected function supports($attribute, $object) 
    {  
     if (!in_array($attribute, array(self::USER_CREATE,self::USER_EDIT,self::USER_DELETE))) { 
      return false; 
     } 

     return true; 
    } 

    protected function voteOnAttribute($attribute, $object, TokenInterface $token) 
    { 
     $user = $token->getUser(); 

     if (!$user instanceof UserInterface) { 
      return false; 
     } 

     switch($attribute) { 
      case self::USER_CREATE: 
       if ($this->decisionManager->decide($token, array('ROLE_USER_MANAGEMENT_WITH_DELETE')) 
        || $this->decisionManager->decide($token, array('USER_MANAGEMENT_WITHOUT_DELETE')) 
       ){ 
        return true; 
       } 
      break; 
      case self::USER_EDIT: 
       // ... 
      break; 
      case self::USER_DELETE: 
       // ... 
      break; 
     } 

     return false; 
    } 
} 

然后你可以检查你的控制器的许可:

userCreateAction() 
{ 
    if(!$this->isGranted('user_create')){throw $this->createAccessDeniedException('You are not allowed to create an user.');} 

    // next steps ... 
}