检查 laravel 中是否有任何中间件授予访问权限
Check if any middleware grant access in laravel
我有两种类型的用户角色。管理员和经理。管理员可以访问所有路由,但经理只能访问其中的一些路由。我的大部分路线都是资源路线。目前我有这个管理员路由组:
Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
Route::resource('post','PostController')
}
这是我的'admin'中间件,如果你需要检查:
if (!Auth::user()->isAdmin())
{
return redirect('/home');
}
return $next($request);
在这里,管理员可以访问所有路由。但我想允许经理访问某些路线,例如 post.index, post.show, post.edit
。
我现在该怎么办?
下面我用例子详细解释我的问题
我有三个中间件,auth, manager, admin
。顾名思义,auth
中间件检查用户是否经过身份验证,manager
中间件检查用户是否是管理员,当然 admin
中间件检查用户是否是管理员。
现在,对于 Route::resource('post','PostController')
路线,
auth
可以访问 post.index, post.view
manager
可以访问 post.index, post.view, post.edit
admin
可以访问所有路由。
应用中间件解决问题的最佳方法是什么?
Laravel 允许在您的控制器中使用多个路由
按照以下步骤操作:
从路由组中删除 'admin' 中间件,只留下 'auth'.
Route::middleware(['auth'])->prefix('admin')->group(function()
{
Route::resource('post','PostController');
}
现在在你的 'manager.php' 路由文件中,你可以使用并指向相同的 PostController
Route::middleware(['auth'])->prefix('manager')->group(function()
{
Route::resource('post','PostController');
}
然后在 PostController 的顶部添加一个 __construct() 方法,像这样
class PostController extends Controller
{
public function __construct()
{
$this->middleware('admin')->except(['index', 'show', 'edit']);
$this->middleware('manager');
}
}
您可以定义部分资源路由。
https://laravel.com/docs/7.x/controllers#restful-partial-resource-routes
因此您可以在您的中间件组中定义其中的一些,而在中间件组之外定义其他的。
Route::middleware(['auth'])->group(function(){
Route::middleware(['admin'])->prefix('admin')->group(function () {
Route::resource('post','PostController')->except([
'index', 'show', 'edit'
]);
}
Route::middleware(['manager'])->prefix('manager')->group(function () {
Route::resource('post','PostController')->only([
'index', 'show', 'edit'
]);
}
}
我有两种类型的用户角色。管理员和经理。管理员可以访问所有路由,但经理只能访问其中的一些路由。我的大部分路线都是资源路线。目前我有这个管理员路由组:
Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
Route::resource('post','PostController')
}
这是我的'admin'中间件,如果你需要检查:
if (!Auth::user()->isAdmin())
{
return redirect('/home');
}
return $next($request);
在这里,管理员可以访问所有路由。但我想允许经理访问某些路线,例如 post.index, post.show, post.edit
。
我现在该怎么办?
下面我用例子详细解释我的问题
我有三个中间件,auth, manager, admin
。顾名思义,auth
中间件检查用户是否经过身份验证,manager
中间件检查用户是否是管理员,当然 admin
中间件检查用户是否是管理员。
现在,对于 Route::resource('post','PostController')
路线,
auth
可以访问post.index, post.view
manager
可以访问post.index, post.view, post.edit
admin
可以访问所有路由。 应用中间件解决问题的最佳方法是什么?
Laravel 允许在您的控制器中使用多个路由
按照以下步骤操作:
从路由组中删除 'admin' 中间件,只留下 'auth'.
Route::middleware(['auth'])->prefix('admin')->group(function()
{
Route::resource('post','PostController');
}
现在在你的 'manager.php' 路由文件中,你可以使用并指向相同的 PostController
Route::middleware(['auth'])->prefix('manager')->group(function()
{
Route::resource('post','PostController');
}
然后在 PostController 的顶部添加一个 __construct() 方法,像这样
class PostController extends Controller
{
public function __construct()
{
$this->middleware('admin')->except(['index', 'show', 'edit']);
$this->middleware('manager');
}
}
您可以定义部分资源路由。
https://laravel.com/docs/7.x/controllers#restful-partial-resource-routes
因此您可以在您的中间件组中定义其中的一些,而在中间件组之外定义其他的。
Route::middleware(['auth'])->group(function(){
Route::middleware(['admin'])->prefix('admin')->group(function () {
Route::resource('post','PostController')->except([
'index', 'show', 'edit'
]);
}
Route::middleware(['manager'])->prefix('manager')->group(function () {
Route::resource('post','PostController')->only([
'index', 'show', 'edit'
]);
}
}