2016-06-03 9 views
1

Ich habe eine Rolle Administrator, Moderator und Mitglied in meiner Laravel-Anwendung. Anwendung haben Front- und Backend-Abschnitte. Ich möchte den Zugriff auf den Backend-Bereich nur für Administrator und Moderator erlauben. Ich schaffe SuperUsersMiddleware:Laravel 5.2 Controller Middleware für mehr als eine Rolle

<?php 

namespace CMS\Http\Middleware; 

use Closure; 

class SuperUsersMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (! $request->user()->hasRole('administrator') || ! $request->user()->hasRole('moderator')) { 
      return redirect('/'); 
     } 
     return $next($request); 
    } 
} 

Register in Kernel.php:

...... 
    protected $routeMiddleware = [ 
     'superusers' => \CMS\Http\Middleware\SuperUsersMiddleware::class, 
     'administrator' => \CMS\Http\Middleware\AdminMiddleware::class, 
     'moderator' => \CMS\Http\Middleware\ModeratorMiddleware::class, 
     'auth' => \CMS\Http\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 
     'guest' => \CMS\Http\Middleware\RedirectIfAuthenticated::class, 
     'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 
    ]; 
..... 

und in meinem Back-End-Ordner erstelle ich Controller.php (alle anderen Controller in Back-End-Abschnitt erweitert diese Controller) und in __construct() Funktionssatz Middleware:

... 
public function __construct() 
    { 
     $this->middleware('superusers'); 
    } 
... 

Aber das funktioniert nicht für mich. Ich erstelle auch Administrator und Moderator Middleware und es funktioniert separat, aber ich brauchte beide - zusammen. Wie geht das? Ich tray:

public function __construct() 
{ 
    $this->middleware('administrator'); 
    $this->middleware('moderator'); 
} 

Aber das kann auch nicht funktionieren. Was ist eine Best Practice für diese Situation?

Antwort

2

Zunächst einmal würde ich keine Middleware auf Ihrem Master Controller anwenden, als dann Middleware auf alles angewendet würde. Sie sollten dies auf jedem einzelnen Controller wie UserController tun.

Sie können so viele Middleware-Instanzen auf eine Route/Funktion anwenden, wie Sie möchten. Mir sind keine Einschränkungen bekannt. Also ich bin nicht sicher, warum sagen Sie das nicht funktioniert:

public function __construct() 
{ 
    $this->middleware('administrator'); 
    $this->middleware('moderator'); 
} 

Sie können die verschiedenen Middleware auf die Strecken anzuwenden, die die verschiedenen Ebenen erfordern. Sie können dies in Ihrem routes.php oder in Ihren Controllern tun. Wenn Sie es in Ihrem Controller tun möchten, wie Sie oben Sie tun so etwas wie dieses haben würde:

public function __construct() 
{ 
    $this->middleware('auth'); //this applies to all actions 
    $this->middleware('administrator', ['only' => ['adminFunction', 'otherAdminFunction','bothCanAccess']]); 
    $this->middleware('moderator',['only' => ['moderatorFunction','bothCanAccess']); 
} 

public function adminfunction() 
{ 
    ... 
} 

public function otherAdminfunction() 
{ 
    ... 
} 

public function moderatorFunction() 
{ 
    ... 
} 

public function bothCanAccess() 
{ 
    ... 
} 

So wird zuerst von der auth Middleware für alle Aktionen gelten. Dies bedeutet, dass ein Benutzer angemeldet sein muss, um auf eine der hier aufgeführten Funktionen zugreifen zu können. Dann können Sie für jede Funktion eine spezifische Middleware anwenden. Wenn Sie weitere Informationen zu diesem Thema benötigen Sie die Dokumentation finden Sie unter:

https://laravel.com/docs/5.2/controllers#controller-middleware

Um dies zu tun in Ihrem Router würden Sie so etwas tun:

Route::get('/admin', ['middleware' => ['auth', 'administrator'],'uses'=>'[email protected]']); 

Also in diesem Fall wird es die auth gelten Middleware zuerst, um sicherzustellen, dass jemand eingeloggt ist, dann feuern die administrator Middleware und stellen Sie sicher, dass der Benutzer ein Administrator ist.

Hoffentlich hilft das.

Verwandte Themen