У меня есть эти коды в моем Controller.php, когда в Yii:
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, используя поведения () ?
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
[
'allow' => true,
'actions' => ['logout'],
'roles' => ['@'],
],
],
],
];
}
Я хотел разместить массив списка определенных пользователей, который разрешает вход в систему.
Может кто-нибудь посоветовать, как я могу сделать то же самое в Yii2, как и в Yii?
Ваша идея не может работать, вы разрешаете только определенным пользователям войти в систему, но вы не знаете, какой пользователь пытается войти в систему, пока они этого не сделают. Поэтому то, что вы пытаетесь достичь, не может работать так, как вы этого хотите, потому что это не имеет смысла.
То, что вы сделали в 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 для вдохновения о том, что вы хотите сделать. Он на самом деле имеет что-то похожее на то, что вы хотите, у него есть список имен пользователей, которые будут администраторами.
Используйте эту функцию:
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()
, верните true или false
Я пытался с этим. Это работает, но я не уверен, что моя идея / концепция верна.
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;
}
@ Михай П., не могли бы вы посоветовать? Любой может также любезно посоветовать. Благодарю. 🙂