Ну это с использованием RBAC, create_post это permission, а если без?
Используя 2 состояния, авторизован и не авторизован.
Код: Выделить всё
$config = [
...
'as access' => [
'class' => 'yii\filters\AccessControl',
'except' => ['site/error', 'site/login'],
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
],
],
Код: Выделить всё
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'except' => ['test'],
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
],
];
}
При таком подходе что бы получить доступ к actionTest надо его прописывать в исключение в конфиге 'site/error', 'site/login', 'site/test'
Иначе получается следующее:
Код: Выделить всё
An Error occurred while handling another error:
exception 'yii\web\ForbiddenHttpException' with message 'Login Required' in E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\User.php:427
Stack trace:
#0 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(154): yii\web\User->loginRequired()
#1 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(138): yii\filters\AccessControl->denyAccess(Object(yii\web\User))
#2 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\ActionFilter.php(75): yii\filters\AccessControl->beforeAction(Object(yii\web\ErrorAction))
#3 [internal function]: yii\base\ActionFilter->beforeFilter(Object(yii\base\ActionEvent))
#4 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Component.php(557): call_user_func(Array, Object(yii\base\ActionEvent))
#5 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(274): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))
#6 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\Controller.php(164): yii\base\Controller->beforeAction(Object(yii\web\ErrorAction))
#7 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(155): yii\web\Controller->beforeAction(Object(yii\web\ErrorAction))
#8 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('error', Array)
#9 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\ErrorHandler.php(97): yii\base\Module->runAction('site/error')
#10 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\ForbiddenHttpException))
#11 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\ForbiddenHttpException))
#12 {main}
Previous exception:
exception 'yii\web\ForbiddenHttpException' with message 'Login Required' in E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\User.php:427
Stack trace:
#0 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(154): yii\web\User->loginRequired()
#1 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(138): yii\filters\AccessControl->denyAccess(Object(yii\web\User))
#2 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\ActionFilter.php(75): yii\filters\AccessControl->beforeAction(Object(yii\base\InlineAction))
#3 [internal function]: yii\base\ActionFilter->beforeFilter(Object(yii\base\ActionEvent))
#4 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Component.php(557): call_user_func(Array, Object(yii\base\ActionEvent))
#5 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(274): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))
#6 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\Controller.php(164): yii\base\Controller->beforeAction(Object(yii\base\InlineAction))
#7 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(155): yii\web\Controller->beforeAction(Object(yii\base\InlineAction))
#8 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('login', Array)
#9 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\Application.php(103): yii\base\Module->runAction('site/login', Array)
#10 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#11 E:\OpenServer\domains\yii2\mysite\public_html\backend\web\index.php(17): yii\base\Application->run()
#12 {main}
Если прописать так:
Код: Выделить всё
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'except' => ['login', 'error', 'test'],
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
],
];
}
То соответственно ошибок нет, но и доступа к actionTest нет.
Решает такую задачу:
Код: Выделить всё
$config = [
...
'as access' => [
'class' => 'yii\filters\AccessControl',
'except' => ['site/error', 'site/login'],
'rules' => [
[
'allow' => true,
'roles' => ['@'],
],
],
],
],
Код: Выделить всё
public function init()
{
parent::init();
Yii::$app->attachBehavior('access', [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error', 'test'],
'allow' => true,
],
[
'actions' => ['index', 'logout'],
'allow' => true,
'roles' => ['@'],
],
],
]);
}
Получен доступ для не авторизованных к login, error, test, к остальным контроллерам и экшенам как определено в конфиге.