Имеется advanced приложение Yii2 с полностью сквозной авторизацией в админке и паблике.
В конфиге прописаны одни куки, ключи и т.д. что бы авторизация работала как положено.
И авторизация работает, но есть проблема с RBAC.
Если в публичной части сайта, авторизован обычный пользователь а не дамин, он может зайти по адресу
site.ru и site.ru/admin/
Но по адресу site.ru/admin/ на всех контроллерах и действиях он будет видеть шаблон админки и 403 ошибку, отказ в доступе.
Так же на этой странице он будет видеть все меню адмики в сайд баре.
Вопрос, как выкинуть юзера при попытке зайти на эту страницу не админом, учитывая то что он может зайти на любой контроллер в админ панели а не только на дефолтный?
Либо как полностью закрыть доступ и отображать ему форму логина, если у него 403?
Доступ закрыт через AccessControl в конфиге адмики.
Ниже привожу код конфига админки.
return [
'id' => 'app-backend',
'basePath' => dirname(__DIR__),
'controllerNamespace' => 'backend\controllers',
'bootstrap' => ['log'],
'modules' => [
'gii' => [
'generators' => [
'migrik' => [
'class' => \insolita\migrik\gii\StructureGenerator::class,
'templates' => [
'custom' => '@backend/gii/templates/migrator_schema',
],
'migrationPath' => '@console/migrations/',
],
'migrikdata' => [
'class' => \insolita\migrik\gii\DataGenerator::class,
'templates' => [
'custom' => '@backend/gii/templates/migrator_data',
],
'migrationPath' => '@console/migrations/',
],
'model' => [
'class' => ModelGenerator::class,
'enableI18N' => True,
'generateQuery' => True,
'ns' => 'core\entities',
'queryNs' => 'core\entities',
'templates' => [
'default' => '@backend/gii/templates/model/default'
]
],
'crud' => [
'class' => CRUDGenerator::class,
'baseControllerClass' => 'yii\web\Controller',
'modelClass' => 'core\entities\\',
'controllerClass' => 'backend\controllers\\',
'enableI18N' => True,
'templates' => [
'default' => '@backend/gii/templates/crud/default'
]
]
],
]
],
'components' => [
'i18n' => [
'translations' => [
'*' => [
'class' => 'yii\i18n\PhpMessageSource',
'basePath' => '@backend/messages',
'sourceLanguage' => 'lt',
'fileMap' => [
//'main' => 'main.php',
],
],
],
],
'request' => [
'csrfParam' => '_csrf-backend',
'baseUrl' => '/admin',
'cookieValidationKey' => $params['cookieValidationKey']
],
'user' => [
'identityClass' => 'common\auth\Identity',
'enableAutoLogin' => true,
'identityCookie' => [
'name' => '_identity',
'httpOnly' => true,
'domain' => $params['cookieDomain']
],
'loginUrl' => ['auth/login'],
],
'session' => [
'name' => '_session',
'cookieParams' => [
'domain' => $params['cookieDomain'],
'httpOnly' => true
]
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'backendUrlManager' => require __DIR__ . '/urlManager.php',
'frontendUrlManager' => require __DIR__ . '/../../frontend/config/urlManager.php',
'urlManager' => function () {
return Yii::$app->get('backendUrlManager');
},
],
'as access' => [
'class' => 'yii\filters\AccessControl',
'except' => ['auth/login', 'site/error'],
'rules' => [
[
'allow' => true,
'roles' => ['admin'],
],
],
],
'params' => $params,
];
Пока что получилось такое решение:
Для частного случая работает вроде.
'as access' => [
'class' => 'yii\filters\AccessControl',
'except' => ['auth/login', 'site/error'],
'rules' => [
[
'allow' => true,
'roles' => ['admin'],
],
[
'allow' => false,
'roles' => ['user'],
'denyCallback' => function ($rule, $action) {
Yii::$app->user->logout();
$action->controller->redirect('auth/login');
},
],
],
],