2016-10-24 48 views
1

我的应用程序有几个动作,但是当用户有一定的角色时,我只想允许一个动作。我找不到在控制器中设置动作的方法。 我想是这样的:Yii2:在控制器中设置动作

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

一个重定向将导致百万CORS问题,所以我想,以避免它。我怎样才能做到这一点?
谢谢!

+0

你有没有使用[访问控制过滤器(HTTP认为:// WWW。 yiiframework.com/doc-2.0/guide-security-authorization.html#access-control-filter)? – Bizley

+0

是的,我做了@Bizley ...但我想要返回某个行为的结果,不管是哪个行为被调用,不要禁止其他行为。我还没有找到一种方法来做到这一点与访问控制... – thomas

回答

2

其中一种方法是在控制器中覆盖createAction()方法。

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

如果条件满足该控制器内的任何称为动作被返回作为actionAllowedAction()方法的结果。

+0

谢谢,这绝对有助于@Bizley – thomas

0

在控制器,你可以使用访问控制过滤器(ACF)

假设你在你的网站控制器希望只允许角色admin访问actionViewforadmin

use yii\web\Controller; 
use yii\filters\AccessControl; 

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

+0

谢谢,不幸的是我似乎太愚蠢,使这与CORS工作。和选项请求... – thomas

+0

@wath你的意思是。这是由Yii2和您的AUTH管理的 – scaisEdge

+0

我需要这个工作作为Angularjs应用程序的API。由于它是跨领域的,Angular始终首先激发OPTIONS请求,以查看是否有人在家。有一些过滤器通常允许这些请求,但我无法让它工作。不过,我想这是针对不同问题的食物。谢谢! – thomas

相关问题