2016-06-03 5 views
1

У меня есть администратор ролей, модератор и член в моем приложении laravel. Приложение имеет фронт и бэкэнд. Я хочу разрешить доступ к разделу бэкэнд только для администратора и модератора. Я создаю SuperUsersMiddleware:Laravel 5.2 Контроллер промежуточного программного обеспечения для более чем одной роли

<?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); 
    } 
} 

Регистрация в 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, 
    ]; 
..... 

и в моей папке бэкэнда создать Controller.php (все остальные контроллеры в серверной секции расширяет этот контроллер) и в __construct() функция set middleware:

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

Но это не работает для меня. Я также создаю промежуточное программное обеспечение администратора и модератора, и он работает отдельно, но мне нужны оба вместе. Как это сделать? I tray:

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

Но это также не может работать. Какова наилучшая практика для этой ситуации?

ответ

2

Во-первых, я бы не применил какое-либо промежуточное программное обеспечение на вашем хозяине Controller, так как тогда промежуточное ПО применялось ко всему. Вы должны сделать это на каждом отдельном контроллере, таком как UserController.

Вы можете применить столько экземпляров промежуточного программного обеспечения к маршруту/функции, сколько захотите. Я не знаю никаких ограничений на это. Так что я не знаю, почему вы говорите, это не работает:

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

Вы можете применить различные межплатформенное к маршрутам, которые требуют различных уровней. Вы можете сделать это в своем routes.php или в своих контроллерах. Если вы хотите сделать это в вашем контроллере, как вы делаете над вами будет иметь что-то вроде этого:

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() 
{ 
    ... 
} 

Так первый от auth промежуточного слоя будет применяться ко всем действиям. Это означает, что пользователь должен войти в систему для доступа к любой функции здесь. Затем вы можете применить конкретное промежуточное ПО к каждой функции. Если вам нужно больше информации об этом проверить документацию:

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

Для этого в маршрутизаторе вы могли бы сделать что-то вроде этого:

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

Так что в этом случае он будет применять auth промежуточное программное обеспечение, чтобы убедиться, что кто-то вошел в систему, а затем запустите промежуточное программное обеспечение administrator и убедитесь, что пользователь является администратором.

Надеюсь, это поможет.