マイアプリは二つの役割があることができます。管理 & 著者(ちなみに、テーブルがあります。役割、権限を、 permission_role 、ROLE_USERは、雄弁モデルRole.php、Permission.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_profile、edit_published_articles、delete_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'));
}
...これは良い方法ではありませんか?どうしますか?コントローラの方法をチェックするだけで十分ですか、あるいはミドルウェアが関与しているはずですか?
これは要約し、長い記事なので:管理 & 著者と::
- 管理者が見ることができるはず/
を、私は二つの役割を作成しました編集/すべての記事を削除します。また、管理者は、登録されたすべてのユーザーを作成および編集/削除することができます。
- 著者は、自分の記事のみを表示/編集/削除することができます。また、著者は自分のプロフィールだけを編集できる必要があります。
どうすればよいですか?
を見てくださいララベル認可。 (https://laravel.com/docs/master/authorization)。これは、あなたが望むことをするためのきれいな方法です。 – linuxartisan