2014-11-25 2 views
1

У меня есть эти коды в моем controller.php, когда в Yii:Как конвертировать «пользователей» в accessRules из Yii1 в поведении() в Yii2

public function filters() 
{ 
    return array('accessControl'); 
} 

public function accessRules() 
{ 
    $allAuthUsers = MyAdmin::model()->getAllUsers(); 

    if (empty($allAuthUsers)) 
     $allUsers = array(NULL); 

    return array(
     array('allow', 
      'users' => $allAuthUsers, 
     ), 
     array('deny'), 
    ); 
} 

Но, как я могу это реализовать в Yii2 используя behaviors()?

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'allow' => true,       
        'roles' => ['@'], 
       ], 
       [ 
        'allow' => true, 
        'actions' => ['logout'], 
        'roles' => ['@'], 
       ], 
      ], 
     ], 
    ]; 
} 

Я хотел поместить список массивов определенных пользователей, который позволяет войти в систему.

Может кто-нибудь посоветует, как я могу сделать аналогичный путь в Yii2, как я это сделал в Yii?

ответ

1

Ваша идея не может работать, вы разрешаете определенным пользователям регистрироваться, но вы не знаете, к чему пользователь пытается войти, пока они этого не сделают. То, что вы пытаетесь выполнить, не может работать так, как вы хотите, потому что это не имеет смысла.

Что вы сделали в yii1 - разрешить доступ к контроллеру (а не к логину) определенным пользователям. Ваш код по-прежнему не имеет смысла (но он работает), потому что вы фактически позволяете всем иметь доступ в любом случае. Так что ваш точный код может быть записан в yii2

/** 
* @inheritdoc 
*/ 
public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'only' => ['logout', 'register', 'register-interest', 'forgot-password', 'login-register', 'reset-password', 'auth_login', 'auth_register', 'request-password-reset'], 
      'rules' => [ 
       [ 
        'actions' => ['register', 'auth_login', 'auth_register', 'register-interest', 'login-register', 'forgot-password', 'reset-password', 'request-password-reset'], 
        'allow' => true, 
        'roles' => ['?'], 
       ], 
       [ 
        'actions' => ['logout'], 
        'allow' => true, 
        'roles' => ['@'], 
       ], 
      ], 
     ], 
    ]; 
} 

Почему вы настаиваете, чтобы использовать список пользователей, вместо того, чтобы использовать роли? Вот официальная документация RBAC https://github.com/yiisoft/yii2/blob/master/docs/guide/security-authorization.md. Идея заключается в том, что доступ к контроллеру может получить только определенная роль (или роли) после того, как пользователь регистрирует роль для него на основе критериев. Вы можете создавать очень сложные роли, но если вы не хотите, чтобы вы могли создавать простые.

Также вы можете ознакомиться с этим: https://github.com/dektrium/yii2-user с документацией здесь: http://yii2-user.readthedocs.org/en/latest/index.html для вдохновения на то, что вы хотите сделать. На самом деле у него есть что-то похожее на то, что вы тоже хотите, у него есть список имен пользователей, которые будут администраторами.

+0

Вы правы, мне нужен только тот список пользователей, которым разрешен доступ к определенному контроллеру (фактически всему контроллеру) после входа в систему. Вы правы, поскольку каждый может войти в систему, если у них есть собственное имя пользователя openid и пароль. Я использую OpenID для модуля входа. Итак, как я могу сделать мои коды понятными? – puppyceceyoyo

+0

не существует свойства $ users в yii \ filters \ AccessRule. – puppyceceyoyo

+0

Извините, я не понимал, что пользователей в yii2 нет. Я использую роли, как это нормально. –

3

Используйте эту функцию:

 array('allow', // allow admin user to perform 'admin' and 'delete' actions 
      'actions'=>array('index','delete','update','approve','unapprove','admin'), 
      'expression'=>'YourFunc(UserRole::LEVEL_ADMIN)', 
     ), 

и YourFunc(), возвращать истинным или ложным

0

Я пытался с этим. Это работает, но я не уверен, правильна ли моя идея/концепция.

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'ruleConfig' => [ 
       'class' => 'app\modules\mymodules\components\MyAccessRule' 
      ], 
      'rules' => [ 
       [ 
        'allow' => true, 
        'roles' => ['@'], 
       ], 
       [ 
        'allow' => true, 
        'actions' => ['logout'], 
        'roles' => ['@'], 
       ], 
      ], 
     ], 
    ]; 
} 

Тогда в моем MyAccessRule.php:

protected function matchRole($user) 
{ 
    if(!empty($user->identity->username) && (MyAdmin::isAdmin($user->identity->username)) 
    { 

     return true;    

    }  

    return false; 

} 

@Mihai P., не могли бы вы посоветовать? Кто-нибудь мог бы тоже посоветовать. Благодарю. :)

+0

Я отредактировал свой ответ, просто научитесь использовать опцию RBAC либо с простым файлом PHP, либо с базой данных. Это мощное и простое в использовании после того, как вы это выясните. После этого вы никогда не вернетесь. –

+0

@Mihai P., спасибо, я учусь использовать его. – puppyceceyoyo

+0

Используйте версию php для начала, вы можете переместить ее в базу данных позже. –