簡體   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