用户角色和权限。 Laravel 强化(不仅如此)
User roles and permissions. Laravel Fortify (and not only)
Fortify
包中是否有任何现成的功能来设置用户角色和权限(普通用户、管理员、主管理员等)?
如果不是,那么自己实施的正确方法是什么?或者,在用户 table 中创建 middleware
和一个 is_admin
字段。并进行检查:
if(Auth::user()->is_admin != 1){
return redirect()->route('index');
}
路线:
Route::group(['middleware' => 'id_admin'], function(){
Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
});
如果我有 2 个用户角色(0 是普通用户,1 是管理员)就很容易了。但是,如果我有一个普通用户、一个管理员(可以编辑、更新、删除产品、类别等)和一个 CEO(可以授予和取消管理员权限、编辑用户数据和删除用户)怎么办?是否值得创建第二个 middleware
来检查 is_ceo
?
第二条middleware
路线:
Route::group(['middleware' => 'id_admin'], function(){
Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
Route::group(['middleware' => 'id_ceo'], function(){
Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->name('ceo_panel');
});
});
方法正确吗?
因为 Fortify 没有针对角色的解决方案,所以我不得不自己编写功能。
使用 我找到了适合我的案例的解决方案。我有 3 个权限级别。
0 - 普通用户,
1 - 管理员,
2 - 首席执行官。
在我的 User
模型中,我这样写:
public function hasRole(){
if($this->role === 2){
return 1&&2;
}else if($this->role === 1){
return 1;
}else{
return redirect()->back();
}
}
一个Role
中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Role
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public const Admin = '1';
public const CEO = '2';
public function handle(Request $request, Closure $next, ... $roles){
$user = Auth::user();
$role = Auth::user()->role;
if (!in_array($user->hasRole(), $roles)) {
return redirect()->back();
}
return $next($request);
}
}
App\Http\Kernel.php
:
protected $routeMiddleware = [
...
'role' => \App\Http\Middleware\Role::class,
...
];
路线:
Route::group(['middleware' => 'auth'], function(){
Route::group(['middleware' => 'role:Admin,CEO'], function(){
Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->middleware('role:CEO')->name('ceo_panel');
Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
});
});
希望有人会觉得这有用!
Fortify
包中是否有任何现成的功能来设置用户角色和权限(普通用户、管理员、主管理员等)?
如果不是,那么自己实施的正确方法是什么?或者,在用户 table 中创建 middleware
和一个 is_admin
字段。并进行检查:
if(Auth::user()->is_admin != 1){
return redirect()->route('index');
}
路线:
Route::group(['middleware' => 'id_admin'], function(){
Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
});
如果我有 2 个用户角色(0 是普通用户,1 是管理员)就很容易了。但是,如果我有一个普通用户、一个管理员(可以编辑、更新、删除产品、类别等)和一个 CEO(可以授予和取消管理员权限、编辑用户数据和删除用户)怎么办?是否值得创建第二个 middleware
来检查 is_ceo
?
第二条middleware
路线:
Route::group(['middleware' => 'id_admin'], function(){
Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
Route::group(['middleware' => 'id_ceo'], function(){
Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->name('ceo_panel');
});
});
方法正确吗?
因为 Fortify 没有针对角色的解决方案,所以我不得不自己编写功能。
使用
0 - 普通用户,
1 - 管理员,
2 - 首席执行官。
在我的 User
模型中,我这样写:
public function hasRole(){
if($this->role === 2){
return 1&&2;
}else if($this->role === 1){
return 1;
}else{
return redirect()->back();
}
}
一个Role
中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Role
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public const Admin = '1';
public const CEO = '2';
public function handle(Request $request, Closure $next, ... $roles){
$user = Auth::user();
$role = Auth::user()->role;
if (!in_array($user->hasRole(), $roles)) {
return redirect()->back();
}
return $next($request);
}
}
App\Http\Kernel.php
:
protected $routeMiddleware = [
...
'role' => \App\Http\Middleware\Role::class,
...
];
路线:
Route::group(['middleware' => 'auth'], function(){
Route::group(['middleware' => 'role:Admin,CEO'], function(){
Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->middleware('role:CEO')->name('ceo_panel');
Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
});
});
希望有人会觉得这有用!