@svfolder2021

Как полностью закрыть админ панель для обычных пользователей в Yii2 со сквозной авторизацией?

Имеется 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');
                },
            ],
        ],

    ],
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Fenix957
Можете прописать событие глобально для конфига backend указав в beforeActin
а там проверять является ли пользователь админом если нет то делать редирект на страницу логина для админов.

'on beforeAction' => function ($event) {
     // здесь ваше событие редиректа или авторизации и т д 
    },


это добавляете в main.php в паке config модуля backend если будут вопросу уточню ответ
Ответ написан
Комментировать
vitaly_74
@vitaly_74
Используя механизм начальной загрузки можно выполнить определенный код до запуска приложения и обработки входящего запроса.
Просто создвйте модуль, например authModule и добавьте его в секцию bootstrap
"bootstrap" => ["log", "authModule"]
а в модуле уже ну как хотите и что хотите делайте.
Он будет подгружаться перед выполнением вашего кода в контроллерах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы