繁体   English   中英

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

[英]Manage Roles and Assign Permissions to Roles - Symfony

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


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

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

我搜索并发现了有关FOSUserBundleACL的信息 一些推荐的ACL,而其他人说最好使用FOSUserBunder

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

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

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

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

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

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

为了处理'权限',我建议使用选民

首先创建一个这样的选民:

配置:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM