2015-01-14 3 views
4

RBAC 마이그레이션이 적용된 yii2 고급 템플릿이 있습니다. RBAC을 배우려고했고 Docs 2.0을 따랐습니다.yii2 백엔드 사용자 로그인 거부

데이터베이스를 사용하여 로그인했지만 프런트 엔드와 백 엔드가 모두 계정으로 로그인되어 있습니다. 2 RBAC 역할 (관리자, 사용자)을 만들었지 만 이해할 수 없거나 찾을 방법을 찾을 수 없습니다.

관리자가 아닌 사용자 역할에 로그인하도록 백엔드를 제한하십시오.

다음은 역할 코드입니다. 및 데이터베이스 항목 :

namespace console\controllers; 

use Yii; 
use yii\console\Controller; 

class RbacController extends Controller 
{ 
    public function actionInit() 
    { 
     $auth = Yii::$app->authManager; 

     // add "admin" role 
     $admin = $auth->createRole('admin'); 
     $auth->add($admin); 

     // add "user" role 
     $user = $auth->createRole('user'); 
     $auth->add($user); 

     $auth->assign($admin, 1); 
    } 
} 

사용자 테이블 :

admin [email protected]  20 10 1421197319 1421197319 
user [email protected]  10 10 1421198124 1421198124 

현재 규칙 :

'rules' => [ 
    [ 
     'actions' => ['login', 'error'], 
     'allow' => true, 
    ], 
    [ 
     'actions' => ['logout', 'index'], 
     'allow' => true, 
     'roles' => ['@'], 
    ], 

답변

10

은 - 참고 :이 솔루션은 정확히 RBAC하지만 ACF 없습니다.

검색 및 컨설팅 후, 나는 그에서 나는 그것이 역할 (로그인 등 제출) 어떤 행동하기 전에 특정 작업을 수행 할 수 없습니다 생각, This yii2 viki.

내가 RBAC 행동의 불분명에서 해결책을 발견 .

실제로 RBAC는 사용자가 시도하는 모든 작업을 수행하게하고, 나중에 허용 여부를 확인하고 허용되지 않으면 차단합니다.

특정 역할이 특정 작업 (예 : 백엔드에서 관리자가 아닌 로그인 거부)을 수행 할 수 없다는 것을 백엔드 시스템에 알리는 방법이 필요했습니다. 이는 RBAC에서 가능하지 않습니다. ACF에 matchCallback을 사용하십시오.

백엔드 규칙 : 참에 matchCallback이 작업을 수행하고 거짓에 할 수

 'rules' => [ 
      [ 
       'actions' => ['login'], 
       'allow' => true, 
      ], 
      [ 
       'actions' => ['logout', 'index'], 
       'allow' => true, 
       'roles' => ['@'], 
       'matchCallback' => function ($rule, $action) { 
        return Yii::$app->user->identity->isAdmin; 
       } 
      ], 
     ] 

가 작업을 거부합니다. isAdminUser 모델에서 정의해야하는 게터 함수입니다.

namespace /common/models/User; 

const ROLE_ADMIN = 20; 
public function getIsAdmin() 
{ 
    return $this->role == self::ROLE_ADMIN; 
} 

는 내가 백엔드 로그인 동작을 변경하여이 기능을 달성 This yii2 viki's comments.

0

당신은 다음과 같이 컨트롤러 당신에게 동작을 추가해야합니다

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'actions' => ['create', 'delete', 'update'], 
        'allow' => true, 
        'roles' => ['admin'], 
       ], 
       [ 
        'actions' => ['index', 'view'], 
        'allow' => true, 
        'roles' => ['user'], 
       ], 
      ], 
     ], 
    ]; 
} 

또는 이 편집 : (누군가가 로그인에 액세스 할 수 있습니다 만 관리자가 액세스 인덱스 페이지에 기록 될 수되도록 규칙) : 해결

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'actions' => ['login'], 
        'allow' => true, 
        'roles' => ['?'], 
       ], 
       [ 
        'actions' => ['index'], 
        'allow' => true, 
        'roles' => ['admin'], 
       ], 
      ], 
     ], 
    ]; 
} 
+0

감사합니다. 이것은 작동하지 않습니다. 백엔드 컨트롤러에는 이미 동작이 있습니다. 누구든지 로그인에 액세스 할 수 있지만 admin 만 로그인하고 액세스 할 수 있도록 규칙을 만들 수 있습니다. 백엔드에는 2 페이지의 색인 및 로그인 만 있습니다. 나는 행동 => [로그인, 색인, 오류] 역할 => [관리자]. 그것은 심지어 로그인 페이지를 볼 수 없습니다, 현재 사용자는 bcoz입니다. 규칙에 따라 관리 역할이 필요합니다. 나는 그것을 시도했다. 문제는 내가 설명했다. – Bsienn

+0

DSN에 RBAC 테이블이 있고 사용자 "admin"이 역할 "admin"을 할당했는지 확인하십시오. 예를 들어 작업에 대한 액세스를 설정하는 방법은 다음과 같습니다. http://www.yiiframework.com/doc-2.0/guide-security-authorization.html – TomaszKane

+0

Yii2 백엔드의 색인 페이지에 공개 액세스를 허용하고 싶었던 문제가있었습니다. 귀하의 코드는 저에게 그 실마리를주었습니다 :) ['actions'=> [ 'index'], 'allow'=> 참, 'roles'=> [ '?'], ] 감사의 친구 –

0

에서 모델의 전체 작업 코드를 게시했다. 여기 내 코드입니다, 나도 잘 모르겠지만, 완벽한 해결책인지 아닌지는 모르지만 그것은 나를 위해 일하고 있습니다.

public function actionLogin() 
{  
    if (!\Yii::$app->user->isGuest) { 
     return $this->goHome(); 
    } 

    $model = new LoginForm(); 
    if ($model->load(Yii::$app->request->post()) && $model->login()) { 
     //check user roles, is user is Admin? 
     if (\Yii::$app->user->can('Admin')) 
     { 
      // yes he is Admin, so redirect page 
      return $this->goBack(); 
     } 
     else // if he is not an Admin then what :P 
     { // put him out :P Automatically logout. 
      Yii::$app->user->logout(); 
      // set error on login page. 
      \Yii::$app->getSession()->setFlash('error', 'You are not authorized to login Admin\'s penal.<br /> Please use valid Username & Password.<br />Please contact Administrator for details.'); 
      //redirect again page to login form. 
      return $this->redirect(['site/login']); 
     } 

    } else { 
     return $this->render('login', [ 
      'model' => $model, 
     ]); 
    } 
} 
+0

솔루션 작동 그러나 근본적인 문제가 있습니다. 첫 번째 장소에 로그온하지 않아야하는 사용자를 첫 번째로 로그온합니다. 여분의 일을하고있어. 나는이 새로운 해결 방법을 이미 새로 도입했다. 내 솔루션을 사용해보십시오. 그것의 더 나은 – Bsienn

2

처음으로 로그인 한 사용자는 자신의 역할을 확인하기 때문에 필요하지 않습니다. LoginForm 모델에 getUser() 메서드가 있고 load()validate()을 호출 한 후 찾을 수 있으며 authManager으로 역할을 확인하십시오. 이 같은 매끄러운은 :

/** @var LoginForm $model */ 
    $model = Yii::createObject('loginForm'); 

    if ($model->load(Yii::$app->request->post()) && $model->validate()) { 
     /** @var User $user */ 
     $user = $model->getUser(); 
     if (!empty($user) && Yii::$app->authManager->checkAccess($user->getId(), 'admin')) { 
      // Don't validate twice 
      $model->login(false); 
      return $this->goBack(); 
     } else { 
      $model->addError('email', 'This user is not authorized for administration'); 
     } 
    } 
    return $this->render('login.twig', [ 
     'model' => $model, 
    ]); 

또한 두 번 validate() LoginForm하려는, 그래서 login() 방법에 $runValidation PARAM를 추가하지 마십시오.

public function login($runValidation = true) 
{ 
    if ($runValidation) { 
관련 문제