2017-11-10 3 views
0

Ich habe eine Menge Antworten darauf gefunden, wie man Zugangskontrolle erstellt, die eine Anmeldung an allen Controllern und Aktionen erfordert.Yii2 alle Controller und Aktionen erfordern Login, müssen einige Ausnahmen hinzufügen. Wie kann ich es tun?

Der folgende Beitrag zeigt, wie ich alle Controller Anmeldung erfordern tat:

Yii2 require all Controller and Action to login

Ich habe den Code unten unter meiner Komponenten verwendet:

'as beforeRequest' => [ 
    'class' => 'yii\filters\AccessControl', 
    'rules' => [ 
     [ 
      'allow' => true, 
      'actions' => ['login', 'error'], 
     ], 
     [ 
      'allow' => true, 
      'roles' => ['@'], 
     ], 
    ] 
], 

Aber ich einige hinzufügen möchten Ausnahmen davon. Bei einigen Controllern müssen einige Aktionen für Guest sichtbar sein.

Ich habe versucht, in meinem Verhalten auf ReportsController diesen Code zu verwenden:

'access' => [ 
      'class' => AccessControl::className(),       
      'rules' => [         
       [ 
        'allow' => true, 
        'actions' => ['share'], 
        'roles' => ['?'], 
       ], 
      ],     
     ] 

noch anmelden erhalten umgeleitet.

Ich versuche, actionShare ($ param) {} Öffentlichkeit Gäste zu machen.

Was fehlt mir?

Vielen Dank für Ihre Hilfe!

+0

so haben Sie ' 'denyCallback' => function() { zurück Yii :: $ app-> response-> redirect (['site/login']); }, 'direkt unter der Konfiguration Ihrer Komponenten? – Kyle

+0

Ja, ich habe den denyCallback so definiert. –

Antwort

0

Zuerst ausführen

yii migrieren --migrationPath = @ yii/rbac/Migrationen

von Eingabeaufforderung in Daten RBAC Tischfuß zu erstellen.

Dann RbacController in Komponentenordner

namespace app\components; 

use yii; 
use yii\web\Controller; 
use yii\filters\AccessControl; 
class RbacController extends Controller 
{ 

public function RbacRule($modules = false) 
{ 
    $rules = false; 
    if ($modules){ 
     $rules = [ 
       'allow' => true, 
       'roles' => ['@'], 
       'matchCallback' => function ($rule, $action) { 
        $module   = Yii::$app->controller->module->id; 
        $action   = Yii::$app->controller->action->id; 
        $controller  = Yii::$app->controller->id; 
        $route   = "/$module/$controller/$action"; 
        $post   = Yii::$app->request->post(); 
        if (\Yii::$app->user->can($route)) { 
         return true; 
        } 
       } 
      ]; 
    }else{ 
     $rules = [ 
       'allow' => true, 
       'roles' => ['@'], 
       'matchCallback' => function ($rule, $action) { 
        //$module   = Yii::$app->controller->module->id; 
        $action   = Yii::$app->controller->action->id; 
        $controller  = Yii::$app->controller->id; 
        $route   = "/$controller/$action"; 
        $post   = Yii::$app->request->post(); 
        if (\Yii::$app->user->can($route)) { 
         return true; 
        } 
       } 
      ]; 
    } 

    return $rules; 
    // return true; 
} 

} 

dann statt Controller erstellen, um diese RbacController auf Ihrem Controller erweitern verwenden.

use app\components\RbacController; 

class AdminController extends RbacController 
{ 
public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       // [ 
       //  'actions' => ['login', 'logout'], 
       //  'allow' => true, 
       //  'roles' => ['?'], 
       // ], 
       parent::RbacRule(), 
      ], 
     ], 
     'verbs' => [ 
      'class' => VerbFilter::className(), 
      'actions' => [ 
       'delete' => ['post'], 
       'bulk-delete' => ['post'], 
      ], 
     ], 
    ]; 
} 
....... 
} 

Wenn Ihr Controller innerhalb Modules-Ordner ist, dann haben Sie Eltern verwenden :: RbacRule (TRUE) statt parent :: RbacRule(),

Verwandte Themen