2014-11-05 4 views
11

지금까지 Yii 1.1.14를 사용하여 웹 앱을 개발했지만 지금은 업그레이드해야 할 때입니다.의문의 여지가 Yii2 RBAC

내가 일하는 회사는 자체 액세스 제어 시스템을 개발했으며, 정말 맘에 든 것을 보았을 때까지는 정말 좋았습니다 ... 데이터베이스의 8 개 테이블 조합 (사용자 테이블 계산 안 함) , 외래 키들이 많다. 컨트롤러 사용자

  • 그리고 다른 테이블의 유형에 대한 메뉴 카테고리
  • 한 테이블에 대한 작업을
  • 1 테이블
  • 1 테이블

    • 1 표 기본적으로 그냥 2에 연결하거나 3 한 번에 그 테이블.

    잘 작동하지만 내 관점에서는 모든 테이블을 유지 관리하는 데 많은 시간이 소요되며 특정 시점에 응용 프로그램이 온라인 상태가 될 때 특정 양의 사용자에게 부딪혔을 때 실제로 느려질 수 있습니다 . 특히 이들 테이블 중 2 개가 사용자의 테이블 기본 키를 외래 키로 가지고 있기 때문에 특히 그렇습니다.

    그래서 Yii 2에서 개발을 시작할 때 RBAC를 사용하기 시작 했으므로 온라인 튜토리얼을 찾기 시작했습니다. 작성자 역할을 가진 여러 코드 버전 , 게시물 작성 또는 업데이트 권한이 필요합니다.

    나는 Youtube에서 5 개의 동영상 조합을 발견했지만 Yii 1 RBAC에 관한 내용입니다. 내가 RBAC의 기능을 대부분 이해할 수 있었기 때문에 도움이되었지만 아래에 열거 한 에 대한 의문점이 아직 남아 있습니다. 그리고이 액세스 제어 시스템에서는 DBManager 클래스를 사용하고 있습니다.

    내 의심

    1. 3 개 테이블을 가지고하는 데 사용 YII 1의 RBAC : auth_assignment, auth_itemauth_item_child. 이제 Yii 2 RBAC에서 auth_rule이라는 새 테이블이 나타나는데 그 테이블에서 수행중인 작업이 무엇인지, 사용 방법 또는 채우는 방법을 아직 이해할 수 없습니다.

    2. 컨트롤러의 동작 방식을 사용하고 사용자의 역할에 따라 일부 동작에 대한 액세스를 할당하여 일부 동작에 대한 사용자의 액세스를 제한 할 수 있지만이 경우에는 내 질문을 2 :

      2.1. 첫 번째 : 비헤이비어 메서드에서 설정하여 작업에 대한 액세스를 제한 할 수 있다면 auth_item 테이블에 사용 권한을 저장하는 용도는 무엇입니까?

      2.2. Second : 권한에 따라 액세스를 제어하기로 결정한 경우 정확히 어떻게 할 것인가? 모든 기능에 다음과 같은 유형의 코드를 작성했기 때문에 RBAC를 사용해야한다고 생각하지는 않습니다. 지루한. 다른 방법이 있어야합니다.때문에 사용자가 로그인 할 때, 복잡한 쿼리가 세션 변수로 저장됩니다 배열을 반환 끝날 것 등이 될 것이다 실행 지금 우리가 사용하는 액세스 제어 시스템의

      public function actionView($id) 
      { 
          if(Yii::$app->user->can('view-users')){ 
           return $this->render('view', [ 
            'model' => $this->findModel($id), 
           ]); 
          }else{ 
           #Redirect to a custom made action that will show a view 
           #with a custom error message 
           $this->redirect(['//site/notauthorized']); 
          } 
      } 
      
    3. 사용자가 액세스 할 수있는 컨트롤러가 속하는 메뉴 범주만큼의 드롭 다운 목록이있는 메뉴를 만드는 데 사용됩니다. RBAC로 어떻게이 작업을 수행 할 수 있습니까?

  • 답변

    0

    컨트롤러는 AccessControl에서 RBAC를 사용할 때 약간의 설정이 필요합니다. 나는 내 자신의 AccessRule 파일을 만들어 그 주위에있다. 관리자가 auth_item 사용자로 정의됩니다

    public function behaviors() 
    { 
        return [ 
         'access' => [ 
          'class' => AccessControl::className(), 
          'ruleConfig' => [ 
           'class' => 'app\components\AccessRule' 
          ], 
          'rules' => [ 
           [ 
            'actions' => ['index', 'resource-type'], 
            'allow'=> true, 
            'roles' => ['admin'], 
           ], 
          ], 
         ], 
        ]; 
    } 
    

    가 auth_item_assignments에 있습니다

    namespace app\components; 
    
    use Yii; 
    
    class AccessRule extends \yii\filters\AccessRule 
    { 
        protected function matchRole($user) 
        { 
         if (empty($this->roles)) { 
          return true; 
         } 
         foreach ($this->roles as $role) { 
          if(Yii::$app->authManager->checkAccess($user->identity->code, $role)) 
           return true; 
         } 
         return false; 
    } 
    

    는 컨트롤러에서 U는 다음과 같이 사용할 수 있습니다.

    2

    RBAC가해야 할 것과 같이 전혀 소리가 나지 않으므로 단지 2.2 질문에 답할 수 있습니다. 그러나 컨트롤러 또는 작업과 일치하는 명명 규칙을 따랐다면 규칙 테이블에서 필요한 정보를 얻을 수 있습니다. 하지만 2.2 응답에에

    : 당신은 단순히 같은 동작을 설정할 수 있습니다

    :

    public function behaviors() 
    { 
        return [ 
         'access' => [ 
          'class' => AccessControl::className(), 
          'rules' => [ 
           [ 
            'allow' => true, 
            'actions' => ['view'], 
            'roles' => ['view-users'], //<-- Note, rule instead of role 
           ], 
         ] 
        ] 
    } 
    

    이것은 '보기 - 자신의-사용자의 스타일 권한의 다른 문제를 해결하지 않습니다, 등 이것은 ActiveRecord 모델을 조사 할 필요가있다 (적어도 내 애플리케이션에서는 그렇다). 당신은 이것을 달성하려면, 여기에 YII 포럼에서 내 게시물을 살펴 :

    http://www.yiiframework.com/forum/index.php/topic/60439-yii2-rbac-permissions-in-controller-behaviors/#entry269913

    0

    을 내가 yii2에 대한 새로운 RBAC 시스템을 만든 것처럼. 당신은 행동에 대한 허가를 지시 할 수 있으며 행동은 당신이이 행동에 대한 권한이 없다는 것을 나타낼 것입니다.

    이렇게하면 식별해야 할 작업에만 액세스 할 수 있습니다.

    여기에 자세한 내용을 올렸습니다. 많은 해결책을 찾을 수 있습니다 here.

    +1

    일부 리소스에 대한 링크가 아닌 답변의 관련 부분을 작성해야합니다. – GMchris

    1

    가장 간단한 방법 중 하나를 사용하여 컨트롤러의 동작에 사용합니다. 여기

    public function behaviors() 
        { 
    
         return [ 
          'access' => [ 
           'class' => \yii\filters\AccessControl::className(), 
           'rules' => [ 
            [ 
             'allow' => true, 
             'roles' => ['sysadmin'], 
             'actions' => ['index','view','update'], 
            ], 
            [ 
             'allow' => true, 
             'roles' => ['staff'], 
             'actions' => ['index','create','update','view'], 
            ], 
           ], 
          ], 
         ]; 
    
        } 
    

    역할은 데이터베이스에 인증 항목 테이블에서 만든 하나이며 그들은 인증 할당 테이블에서 사용자를 위해 할당되었습니다. 행동에서는 위와 같이 사용합니다. 위의 코드에서 sysadmin은 작업을 인덱싱,보기 및 업데이트 할 수있는 반면 직원은 작업을 인덱싱, 생성, 업데이트 및 볼 수 있습니다.

    0

    이것은 사용 권한별로 액세스를 필터링 할 필요가있을 때 발생할 수있는 최선의 해결책입니다. 귀찮은 일이지만 생산적인 환경에서 역할을 만들고 rbac을 사용하려는 경우 유용 할 수 있습니다.

    use yii\web\ForbiddenHttpException; 
    
    
    if(Yii::$app->user->can('view-users')){ 
        return $this->render('view', [ 
         'model' => $this->findModel($id), 
        ]); 
    }else{ 
        throw new ForbiddenHttpException('You dont have access to this site'); 
    } 
    
    관련 문제