2016-06-03 4 views
1

내 laravel 응용 프로그램에 역할 관리자, 중재자 및 구성원이 있습니다. 응용 프로그램은 정면 및 백엔드 섹션이 있습니다. 관리자 및 중재자 만 백엔드 섹션에 대한 액세스를 허용하려고합니다.) ( Laravel 하나 이상의 역할을위한 컨트롤러 미들웨어

...... 
    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에 : Kernel.php에서

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

등록 : 나는 SuperUsersMiddleware 만들 기능 세트 미들웨어 :

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

그러나 이것은 나를 위해 작동하지 않습니다. 또한 관리자와 중재자 미들웨어를 만들었으며 따로 작동하지만 두 가지가 모두 필요했습니다. 그렇게하는 방법? I 용지함 :

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 미들웨어를 실행하고 사용자가 관리자인지 확인하십시오.

잘하면 도움이됩니다.

관련 문제