2016-07-25 11 views
2

私は、ロール&の権限に基づいてsymfony 3の管理パネルを構築しています。各管理者には役割(または複数の役割)が割り当てられ、その役割に割り当てられている権限に基づいて作業を実行できます。役割を管理し、役割に権限を割り当てる - symfony


あなたのアイデアを与えるために、ここでは例です:

  • 管理パネルでは、ユーザーを追加し、ユーザーを編集して、ユーザーを削除する機能を持っています。
  • ロールを作成しました:USER_MANAGEMENT_WITHOUT_DELETEuser_createuser_editの許可を得ました。
  • 私はだから今user_createuser_edituser_delete
  • へのアクセス権を持っているUSER_MANAGEMENT_WITH_DELETE役割、役割を持つ管理者が作成したUSER_MANAGEMENT_WITH_DELETEできaddeditdelete役割を持つ管理者としてUSER_MANAGEMENT_WITHOUT_DELETEのみaddeditユーザーがそれらを削除することはできませんユーザー。

私が検索しFOSUserBundleACL知りました。いくつかのrecommended ACLは、他の人は、私もそれがroles列、a:1:{i:0;s:10:"ROLE_ADMIN";}のようなものでロールを格納する方法FOSUserBunderのマニュアルを読み、use FOSUserBunder

にましだと言うが、しかしパーミッションについて言及したものは何もありません。だからここに私の質問です:

  1. 私は2つの間で混乱しています。どちらを使うべきですか?
  2. 私がFOSUserBunderを使用している場合、どのように権限を管理するのですか?

答えて

3

ロールは特定のFOSUserBundleではありません。彼らはSymfonyにいます。

ACLsは、ロールを使用するより複雑です。だから私は役割を使用することをお勧めします。 symfonyのドキュメントから

:ACLのを使用してACL

へ 代替は些細なことではない、とシンプルなユースケースのために、それは やり過ぎかもしれません。あなたの許可ロジックが、 (ブログが現在のユーザによって所有されているかどうかを確認するなど)コードを書くだけで記述できる場合は、 投票者の使用を検討してください。投票者が投票されたオブジェクト に渡され、それを使用して複雑な決定を下し、 独自のACLを効果的に実装することができます。強制的な許可(例えば、isGranted部分)は になりますが、このエントリーに表示されているものとよく似ていますが、有権者クラスは ACLシステムではなくロジックを処理します。

の許可 "に対処するために、私はVotersを使用するsuggetます:すべての

まず、このように有権者を作成します。

構成:

# 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 ... 
} 
関連する問題