【发布时间】:2016-10-31 08:06:32
【问题描述】:
我的应用有两个角色:admin & author(顺便还有表格:roles、permissions em>、permission_role、role_user,还有Eloquent模型Role.php、Permission.php...在模型 User.php 有一个名为 hasRole 的方法,用于检查用户是否具有某些角色...最后,在 AuthServiceProvider.php 中有:
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();
}
无论如何,我已经创建了两个角色:admin 和 author。
- 管理员应该能够查看/编辑/删除所有文章。此外,管理员应该能够创建和编辑/删除所有注册用户。
- 作者应该只能查看/编辑/删除他自己的文章。此外,作者应该只能编辑自己的个人资料。
我不确定哪种方法最好。创建以下权限是否是个好主意:
- manage_users
- edit_profile
- manage_articles
- edit_published_articles
- delete_published_articles
然后 admin 角色将拥有所有这些权限,而 author 将只有: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...
但是,我很确定这不是最好的方法。也许我根本不需要权限 - 与其在控制器方法中检查权限,不如询问用户是否具有特定角色 (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'));
}
...或者这也不是好方法?你会怎么做?仅检查控制器方法就足够了,还是应该涉及一些中间件?
由于这篇文章很长,总结一下:
我创建了两个角色:admin & author 和:
- 管理员应该能够查看/编辑/删除所有文章。此外,管理员应该能够创建和编辑/删除所有注册用户。
- 作者应该只能查看/编辑/删除他自己的文章。此外,作者应该只能编辑自己的个人资料。
你会怎么做?
【问题讨论】:
-
看看 Laravel 授权。 (laravel.com/docs/master/authorization)。这是一种更简洁的方式来做你想做的事。
标签: php laravel laravel-5 laravel-5.1 laravel-5.2