2016-10-24 95 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

相關問題