2016-06-28 11 views
0

マイアプリは二つの役割があることができます。管理 & 著者(ちなみに、テーブルがあります。役割権限を、 permission_role ROLE_USERは、雄弁モデルRole.phpPermission.phpはUser.phpは、ユーザーが何らかの役割を持っているかどうかをチェックするhasRoleもと呼ばれる方法があるモデルに...があります... a最終的には、AuthServiceProvider.phpでありND:管理 & 著者Laravel:管理者が/編集/すべてを削除見ることができますが、著者は、唯一、自分の

とにかく
public function boot(GateContract $gate) 
{ 
    $this->registerPolicies($gate); 

    foreach ($this->getPermissions() as $permission) { 
     $gate->define($permission->name, function($user) use ($permission) { 
      return $user->hasRole($permission->roles); 
     }); 
    } 
} 

protected function getPermissions() 
{ 
    return Permission::with('roles')->get(); 
} 

、私は2つの役割を作成しました。

  • 管理者はすべての記事を表示/編集/削除できます。また、管理者は、登録されたすべてのユーザーを作成および編集/削除することができます。
  • 著者は、自分の記事のみを表示/編集/削除することができます。また、著者は自分のプロフィールだけを編集できる必要があります。

これを作成する最も良い方法はわかりません。次の権限を作成するために良いでしょう:

  • manage_users
  • edit_profile
  • manage_articles
  • edit_published_articles
  • delete_published_articles

、その後管理役割はすべてを持っているでしょうこれらのアクセス許可のうち、著者だけだろう:edit_profileedit_published_articlesdelete_published_articles ...その後

を、でUsersController.phpをそれぞれの方法では、私がアクセス権をチェックします:

public function index() 
{ 
    if (Auth::user()->can('edit_profile')) { 
     if (Auth::user()->can('manage_users')) { 
      $users = User::with('roles')->get(); 
      return view('backend.users.index', compact('users')); 
     } 
     $users = collect([Auth::user()]); 
     return view('backend.users.index', compact('users')); 
    } 
    return redirect('backend'); 
} 

public function create(User $user) 
{ 
    if (Auth::user()->can('manage_users')) { 
     $roles = Role::lists('label', 'name'); 
     return view('backend.users.form', compact('user', 'roles')); 
    } 
    return redirect('backend'); 
} 

public function store(Requests\StoreUserRequest $request) 
{ 
    if (Auth::user()->can('manage_users')) { 
     $user = new User($request->only('name', 'email', 'password')); 
     $user->save(); 

     $roleName = $request->input('role'); 
     $user->assignRole($roleName); 

     session()->flash('status', 'User has been created.'); 
     return redirect(route('backend.users.index')); 
    } 
    return redirect('backend'); 
} 

public function edit($id) 
{ 
    if (Auth::user()->can('edit_profile')) { 

     if (Auth::user()->can('manage_users')) { 
      $user = User::findOrFail($id); 
      $roles = Role::lists('label', 'name'); 
      foreach ($user->roles as $role) { 
       $roleName = $role->name; 
      } 
      return view('backend.users.form', compact('user', 'roles', 'roleName')); 
     } 

     $user = User::findOrFail($id); 
     if ($user->id == Auth::user()->id) { 
      $roles = Role::lists('label', 'name'); 
      foreach ($user->roles as $role) { 
       $roleName = $role->name; 
      } 
      return view('backend.users.form', compact('user', 'roles', 'roleName')); 
     } 
    } 
    return redirect('backend'); 
} 
// ... and so on... 

BUT私はこれが最善の方法ではないと確信しています。たぶん私は、すべての権限を持っている必要はありません - 代わりに、それは良いだろう、コントローラのメソッドの権限をチェックするのではなく、例えば、ユーザーが特定の役割(if (Auth::user()->hasRole('admin')))を持っているかどうかを尋ねるために:

public function index() 
{ 
    if (Auth::user()->can('edit_profile')) { 
     if (Auth::user()->can('manage_users')) { 
      $users = User::with('roles')->get(); 
      return view('backend.users.index', compact('users')); 
     } 
     $users = collect([Auth::user()]); 
     return view('backend.users.index', compact('users')); 
    } 
    return redirect('backend'); 
} 

私たちは希望言う:

public function index() 
{ 
    if (Auth::user()->hasRole('admin')) { 
      $users = User::with('roles')->get(); 
      return view('backend.users.index', compact('users')); 
     } 
     $users = collect([Auth::user()]); 
     return view('backend.users.index', compact('users')); 
} 

...これは良い方法ではありませんか?どうしますか?コントローラの方法をチェックするだけで十分ですか、あるいはミドルウェアが関与しているはずですか?


これは要約し、長い記事なので:管理 & 著者と::

  • 管理者が見ることができるはず/

    を、私は二つの役割を作成しました編集/すべての記事を削除します。また、管理者は、登録されたすべてのユーザーを作成および編集/削除することができます。

  • 著者は、自分の記事のみを表示/編集/削除することができます。また、著者は自分のプロフィールだけを編集できる必要があります。

どうすればよいですか?

+1

を見てくださいララベル認可。 (https://laravel.com/docs/master/authorization)。これは、あなたが望むことをするためのきれいな方法です。 – linuxartisan

答えて

1

私は自分のアプリでいくつかの役割を持っていますが、基本的に私はこのようにしました。あなたはまた、司会者です管理されている場合はそうbasicly

public function isAdmin() 
{ 
    return $this->role == self::ROLE_ADMIN; 
} 

public function isModerator() 
{ 
    return $this->role == self::ROLE_MODERATOR || $this->role == self::ROLE_ADMIN; 
} 

:私のアプリで

は、管理者は、モデルのユーザーでモデレーターとより多くのように、私は同じような機能を作成し、すべてを行うことができます。しかし、あなたの役割/権限とスタッフに基づいていくつかの他の機能を作ることができます

そして、私はこれを作る最良の方法だと思われるので、ミドルウェアを使用します。

ので、コードは次のようになります。

//app/http/middleware/Admin.php 
namespace App\Http\Middleware; 

class Admin 
{ 

    public function handle($request, Closure $next, $guard = null) 
    { 
     if (!Auth::user()->isAdmin()) { 
      if ($request->ajax()) { 
       return response('Unauthorized.', 401); 
      } elseif (Auth::user()->isModerator()) { 
       return redirect()->guest('moderate'); 
      } else { 
       return redirect()->guest('login'); 
      } 
     } 

     return $next($request); 
    } 
} 

//app/http/middleware/Moderate.php 
namespace App\Http\Middleware; 

class Moderate 
{ 

    public function handle($request, Closure $next, $guard = null) 
    { 
     if (!Auth::user()->isModerator()) { 
      if ($request->ajax()) { 
       return response('Unauthorized.', 401); 
      } else { 
       return redirect()->guest('login'); 
      } 
     } 

     return $next($request); 
    } 
} 

はカーネルでそれを初期化:あなたが使用することができ、あなたのコントローラで

protected $routeMiddleware = [ 
    'admin' => \App\Http\Middleware\Admin::class, 
    'moderate' => \App\Http\Middleware\Moderate::class, 
    //... 
]; 

、その後:

public function __construct() 
{ 
    $this->middleware('auth'); 
    $this->middleware('admin'); //or moderate or whatever 
} 
関連する問題