管理角色并为角色分配权限 - Symfony

时间:2016-07-25 10:39:49

标签: php symfony permissions fosuserbundle acl

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

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

  • 管理面板具有添加用户,编辑用户和删除用户的功能。
  • 我创建了一个角色:USER_MANAGEMENT_WITHOUT_DELETE,其拥有user_createuser_edit的权限。
  • 我创建了USER_MANAGEMENT_WITH_DELETE角色,该角色拥有user_createuser_edituser_delete
  • 的权限
  • 现在,拥有角色USER_MANAGEMENT_WITH_DELETE的管理员可以addeditdelete作为管理员,角色USER_MANAGEMENT_WITHOUT_DELETE的用户只能add }和edit个用户但无法删除它们。

我搜索了一下FOSUserBundleACL。有些recommended ACL而其他人则认为use FOSUserBunder

更好

我还阅读了FOSUserBunder的文档以及它如何在roles列中存储角色,类似于a:1:{i:0;s:10:"ROLE_ADMIN";},但没有提及权限。所以这是我的疑问:

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

1 个答案:

答案 0 :(得分:6)

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

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

来自Symfony文档: ACL的替代方案

  

使用ACL并非易事,对于更简单的用例,它可能是   矫枉过正。如果您的权限逻辑可以通过编写来描述   一些代码(例如,检查博客是否归当前用户所有),然后   考虑使用选民。选民被传递给被投票的对象,   您可以用它来制定复杂的决策并有效实施   你自己的ACL。执行授权(例如isGranted部分)将   看起来与你在这个条目中看到的相似,但是你的选民类会   处理幕后的逻辑,而不是ACL系统。

要处理'权限',我建议使用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 ...
}