2016-05-12 55 views
1

我正在laravel做項目。我想根據他的角色重定向用戶。如何使用中間件根據用戶角色進行重定向?

我的表是,

用戶有表中的字段(ID,姓名,密碼)。

角色表中有字段(id,角色)。

assigned_role表中有字段(id,role_id,user_id)。

我有用戶模型,

user.php的

public function roles() 
{ 
    return $this->belongsToMany('App\Role', 'assigned_roles', 'user_id', 'role_id'); 
} 

對於我創建命名爲 'RoleMiddleware'

RoleMiddleware一箇中間件:

public function handle($request, Closure $next) 
{ 
    $roles = $request->user()->roles; 
    foreach ($roles as $role) { 
     if($role->name != 'super-admin') 
      return redirect('/user'); 
    } 

    return $next($request); 
} 

我有這樣的中間件kernel.php文件,

Kernel.php樣子,

protected $routeMiddleware = [ 
    'auth' => \App\Http\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 
    'role' => \App\Http\Middleware\RoleMiddleware::class, 

]; 

,但現在我不知道如何使用這個中間件。當我在Route.php文件,

Route::group(['middleware' => 'web'], function() { 

    Route::auth(); 
    Route::group(['middleware' => 'role'], function() { 
     Route::get('/home', '[email protected]'); 
     Route::get('/user', '[email protected]'); 

    }); 
}); 

添加此中間件但是,當我登錄過程重定向到正確的URL。但現在它可以訪問內頁而不檢查用戶是否登錄。而當我對RoleMiddleware部件發表評論時,它會阻止訪問內頁,除非用戶進行日誌記錄。

我不知道該怎麼做。

+1

只有當用戶只有「超級管理員」角色時,纔會重定向用戶。在所有其他情況下,用戶將被重定向。 – blablabla

+0

我不明白你想說什麼 – Amarja

回答

1

如果我理解正確你:

  • 你想限制不具有超級用戶角色(weither他們進行身份驗證或沒有),以防止他們訪問某個網址的用戶。
  • 您還試圖將沒有超級管理員角色的任何經過身份驗證的用戶重定向到url /user

正確嗎?

以下是操作方法:

在您的路線。PHP文件,你需要提供的超級管理員用戶路徑和身份驗證的用戶(不含超級管理員角色)

Route::group(['middleware' => 'web'], function() { 

    Route::auth(); 

    Route::group(['middleware' => ['auth', 'role']], function() { 
     // All routes you put here can only be accessible to users with super-admin role 

    }); 

    Route::group(['middleware' => 'auth'], function() { 
     // All routes you put here can be accessible to all authenticated users 

    }); 
}); 

而在你的角色中間件需要防止身份驗證的用戶沒有超級管理員角色訪問指定網址,在這種情況下,只需將它們重定向到另一個url

public function handle($request, Closure $next) 
{ 
    $roles = $request->user()->roles; 
    foreach ($roles as $role) { 
     if($role->name == 'super-admin') 
      // If user is super-admin, accept the request 
      return $next($request); 
    } 
    // If user does not have the super-admin role redirect them to another page that isn't restricted 
    return redirect('/user');   
} 
+0

不錯,它按預期工作!非常感謝 :) – Amarja

相關問題