2016-07-25 3 views
2

나는 역할 &을 기반으로 Symfony 3에 관리자 패널을 구축하고 있습니다. 각 관리자에게는 역할 (또는 여러 역할)이 할당되며 해당 역할에 할당 된 권한을 기반으로 작업을 수행 할 수 있습니다.역할 관리 및 역할에 대한 권한 할당 - Symfony


하는 당신에게 아이디어를 제공하기 위해, 여기에 예입니다 :

  • 관리자 패널은 사용자 편집 사용자를 추가하고 사용자를 삭제할 수있는 기능이 있습니다.
  • 역할을 만들었습니다 : USER_MANAGEMENT_WITHOUT_DELETEuser_createuser_edit에 대한 권한이 있습니다.
  • 나는 이제 user_create, user_edituser_delete
  • 할 수있는 권한이 USER_MANAGEMENT_WITH_DELETE 역할, 역할 관리를 생성 USER_MANAGEMENT_WITH_DELETEadd, editdelete 역할이 관리자로 USER_MANAGEMENT_WITHOUT_DELETEaddedit 사용자가 있지만 삭제할 수는 없습니다 수있는 사용자 .

내가 검색 한 약 FOSUserBundleACL을 발견했다. 일부 recommended ACL 다른 사람들은 내가 또한 roles 열, a:1:{i:0;s:10:"ROLE_ADMIN";} 같은에서 역할을 저장하는 방법 FOSUserBunder의 문서를 읽고 use FOSUserBunder

에 더 나은 말을하면서,하지만 권한에 대한 언급은 없습니다. 그래서 내 질문은 다음과 같습니다.

  1. 나는 둘 사이에 혼란스러워합니다. 어느 것을 사용해야합니까?
  2. FOSUserBunder을 사용하는 경우 사용 권한을 관리하는 방법은 무엇입니까?

답변

3

역할이 FOSUserBundle과 관련이 없습니다. Symfony에 있습니다.

ACLs은 역할을 사용하는 것보다 복잡합니다. 그래서 역할을 사용하도록 제안합니다. 심포니 문서에서

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