AccessControl: Как разрешить action и для гостя и для авторизованного пользователя

Всё что касается построения API
Ответить
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

AccessControl: Как разрешить action и для гостя и для авторизованного пользователя

Сообщение bemulima »

Цель: разрешить доступ к action и для гостя и для авторизованного пользователя.

Есть родительский контроллер с CORS:

Код: Выделить всё

class Controller extends \yii\rest\Controller {

    public function behaviors()
    {
        return [
            'corsFilter' => [
                'class' => Cors::class,
                'cors' => [
                    // restrict access to
                    'Origin' => ['http://192.168.88.29:3000', 'http://192.168.88.25:3000', 'http://localhost:3000'],
                    // TODO заголовки требуют дополнительную проверку
                    'Access-Control-Allow-Origin' => ['*'],
                    'Access-Control-Allow-Headers' => [
                        'Access-Control-Allow-Headers',
                        'Origin',
                        'Accept',
                        'X-Requested-With',
                        'Content-Type',
                        'Access-Control-Request-Method',
                        'Access-Control-Request-Headers',
                        'Authorization',
                        'Refresh-Token',
                    ],
                    // Allow only POST and PUT methods
                    'Access-Control-Request-Method' => ['POST','GET','OPTIONS'],//'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'
                    // Allow only headers 'X-Wsse'
                    'Access-Control-Request-Headers' => ['X-Wsse'],
                    // Allow credentials (cookies, authorization headers, etc.) to be exposed to the browser
                    'Access-Control-Allow-Credentials' => true,
                    // Allow OPTIONS caching
                    'Access-Control-Max-Age' => 3600,// Cache (seconds)
                    // Allow the X-Pagination-Current-Page header to be exposed to the browser.
                    'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
                ],

            ],
            'authenticator' => [
                'class' => CompositeAuth::class,
                'authMethods' => [
//                    HttpBasicAuth::class,
                    HttpBearerAuth::class,
//                HttpHeaderAuth::class,
//                QueryParamAuth::class
                ],
            ]
        ];
    }

    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'options' => [
                'class' => OptionsAction::class
            ]
        ];
    }

}
От этого контроллера наследуются все остальные контроллеры. В дочернем контроллере устанавливаю правила:

Код: Выделить всё

    public function behaviors()
    {

        $behaviors = parent::behaviors();
        $behaviors['access'] = [
            'class' => AccessControl::class,
            'rules' => [
                [
                    'allow' => true,
                    'actions' => [
                        'get-resume-by-id'
                    ],
                    'roles' => ['@', '?'],
                ],
                [
                    'allow' => true,
                    'actions' => [
                        'load-my-resume-list',
                        'load-user-resume-list',
                        'manage-service',
                    ],
                    'roles' => [User::ROLE_APPLICANT],
                ],
            ]
        ];
        $behaviors['verbs'] = [
            'class' => VerbFilter::class,
            'actions' => [
                'load-my-resume-list' => ['POST'],
            ],
        ];

        return $behaviors;
    }
Action get-resume-by-id должен быть доступен и для гостя и для авторизованного пользователя. Но в данном примере для гостя закрывается доступ хоть и в AccessControl указан, что этот экшн доступен и для гостя и для авторизованного пользователя

Пробовал добавить правила

Код: Выделить всё

$behaviors['authenticator']['except'] = ['options','get-resume-by-id'];
        $behaviors['authenticator']['only'] = ['get-resume-by-id', 'load-my-resume-list',
            'load-user-resume-list',
            'manage-service'];
То, тогда экшн доступен и для всех НО если в заговоловке добавить access_token для авторизация, то пользователя не авторизует

Код: Выделить всё

Authorization: Bearer Nsv2AOzP1h-DxhCjsGGcVNrraar_gHIHNSdEJcCn
Хотелось бы, если есть access_token, то авторизовать и передать дополнительные данные для авторизованного пользователя.

Подскажите пожалуйста, как решить вопрос, что не так, куда копать?
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

Re: AccessControl: Как разрешить action и для гостя и для авторизованного пользователя

Сообщение bemulima »

Вот так заработал, но не думаю, что хороший вариант.

Код: Выделить всё

public function beforeAction($action)
    {
        if($action->id === 'get-resume-by-id') {
            // Попытка авторизовать пользователя
            try {
                return parent::beforeAction($action);
            }catch (\Exception $exception) {
                return true;
            }
        }else
            return parent::beforeAction($action);
    }
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: AccessControl: Как разрешить action и для гостя и для авторизованного пользователя

Сообщение unknownby »

bemulima писал(а): 2021.09.08, 12:57 Вот так заработал, но не думаю, что хороший вариант.
Пробовали убрать роли или вообще удалить эту вещь из 'rules' ?

Код: Выделить всё

                [
                    'allow' => true,
                    'actions' => [
                        'get-resume-by-id'
                    ],
                ],
Ответить