2016-05-12 10 views
1

私はlaravelでプロジェクトをやっています。私は自分の役割に従ってユーザーをリダイレクトしたい。ミドルウェアを使用してユーザーの役割に応じてリダイレクトする方法は?

私のテーブルは、

ユーザー表持つフィールド(ID、名前、パスワード)です。

ロールフィールド(ID、ロール)を持つテーブル。

assigned_roleフィールド(id、role_id、user_id)を持つテーブル。

私は 'RoleMiddleware'

RoleMiddlewareとして指名1つのミドルウェア作成していることについては

User.php

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

、と私はUserモデルを持っている:

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が

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, 

]; 

、のように見えますが、今、私は、このミドルウェアを使用する方法がわからない、kernel.phpファイルに

をこのミドルウェアを持っています。私はそれが正しいURLにリダイレクトプロセスに署名しなかったとき、私は

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

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

    }); 
}); 

、としてRoute.phpファイルで、このミドルウェアを追加しかしとき。しかし、ユーザーがログインしているかどうかを確認せずに、内部ページにアクセスできるようになりました。 RoleMiddlewareの部分にコメントを書くと、内部のページにアクセスすることができなくなり、ユーザーがロギングしない限り、

私はこれを行う方法がわかりません。

+1

「スーパー管理者」の役割を持つユーザーだけをリダイレクトすることはできません。それ以外の場合は、ユーザーはリダイレクトされます。 – blablabla

+0

私はあなたが言うことを得ようとしていません – Amarja

答えて

1

私が正しくあなたを理解している場合:

  • をあなたは、特定のURLにアクセスしてからそれらを防ぐために、スーパー-adminロールを(それらが認証されたりされていないweither)持っていないユーザーを制限したいです。
  • また、スーパー管理者の役割を持たない認証済みユーザーをURL /userにリダイレクトしようとしています。

正しいですか?

これを行う方法は次のとおりです。

あなたのルートにあります。(superAdminロールなし)あなたはスーパー・ユーザの​​ユーザと認証されたユーザーのためのルートを提供する必要が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にアクセスするsuperAdminロールせずに認証されたユーザーを防止する必要がありますこの場合、単に別の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

関連する問題