Yii2: установить действие в контроллере

#yii2

#yii2

Вопрос:

В моем приложении есть несколько действий, но когда у пользователя есть определенная роль, я хочу разрешить только одно. Я не могу найти способ установить действие в контроллере. Я хочу что-то вроде этого:

 public function beforeAction($action) 
{
    if($action->id != 'range') 
    {
       # run another action with custom params
    }
    else return 1;
}
  

Перенаправление привело бы к миллиону проблем с CORS, поэтому я хотел бы избежать этого. Как я могу этого добиться?
Спасибо!

Комментарии:

1. Рассматривали ли вы возможность использования фильтра контроля доступа ?

2. Да, я сделал @Bizley … но я хочу вернуть результат определенного действия, независимо от того, какое действие было вызвано, а не запрещать другие. Я не нашел способа сделать это с помощью Access Control …

Ответ №1:

Один из способов сделать это — переопределить createAction() метод в контроллере.

 public function createAction($id)
{
    if (/* condition for one action limit */) {
        $id = 'allowedAction';
    }
    return parent::createAction($id);
}
  

Если условие выполнено, любое вызванное действие в этом контроллере возвращается как результат actionAllowedAction() метода.

Комментарии:

1. Спасибо, это определенно помогает @Bizley

Ответ №2:

В контроллере вы можете использовать фильтр контроля доступа (ACF)

предполагая, что вы хотите, чтобы контроллер вашего сайта разрешал доступ к actionViewforadmin только роли администратора

 use yiiwebController;
use yiifiltersAccessControl;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['login', 'logout', 'signup', 'viewforadmin'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['login', 'signup'],
                        'roles' => ['?'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['logout'],
                        'roles' => ['@'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['viewforadmin'],
                        'roles' => ['admin'],
                    ],                   
                ],
            ],
        ];
    }
    // ...
}
  

вы можете ознакомиться с этим кратким руководством

http://www.yiiframework.com/doc-2.0/guide-security-authorization.html или эта ссылка http://www.yiiframework.com/doc-2.0/yii-base-actionfilter.html

Комментарии:

1. Спасибо, к сожалению, я, кажется, слишком глуп, чтобы заставить это работать с CORS. и запросы ОПЦИЙ…

2. Мне нужно, чтобы это работало как API для приложения Angularjs. Поскольку это междоменный Angular, он всегда сначала отправляет запрос параметров, чтобы узнать, дома ли кто-нибудь. Существуют фильтры, которые обычно разрешают эти запросы, но я не могу заставить их работать. Хотя, я думаю, это повод для другого вопроса. Спасибо!

3. ACF работает также в контроллере RESTful .. тоже .. в любом случае спасибо