Jes*_*sse 10 php laravel-middleware laravel-blade laravel-5.4
我一直在使用Laravel的中间件遇到一些问题.让我告诉你我想要完成的基本想法:
网站上的注册用户将具有以下四种角色之一:
fyi:'overview'是一种索引视图,但仅适用于审批者角色和更高级别
你们有什么建议是最好的方法呢?这是我到目前为止所做的,但它似乎不起作用:
Kernel.php
protected $middlewareGroups = [
...
'approver+' => [
\App\Http\Middleware\Approver::class,
\App\Http\Middleware\Editor::class,
\App\Http\Middleware\Admin::class,
],
];
protected $routeMiddleware = [
...
'student' => \App\Http\Middleware\Student::class,
'approver' => \App\Http\Middleware\Approver::class,
'editor' => \App\Http\Middleware\Editor::class,
'admin' => \App\Http\Middleware\Admin::class,
];
Run Code Online (Sandbox Code Playgroud)
HTTP \中间件\ admin.php的
public function handle($request, Closure $next)
{
if (Auth::check())
{
if(Auth::user()->isAdmin())
{
return $next($request);
}
}
return redirect('login');
}
Run Code Online (Sandbox Code Playgroud)
'用户'Eloquent模型:
public function isAdmin()
{
if($this->role_id === 4)
{
return true;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Approver和Editor中间件文件中完成了相同的操作,并且在User模型中的isApprover和isEditor函数中,只将if语句中的checked值分别编辑为2和3.
最后,这是我在routes\web文件中所做的:
Route::get('scholen', 'SchoolsController@index');
Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('approver+');
Route::get('admin/scholen/maken', 'SchoolsController@create')->middleware('approver+');
Route::post('scholen', 'SchoolsController@store')->middleware('approver+');
Route::get('scholen/{id}', 'SchoolsController@show');
Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('admin');
Route::patch('admin/scholen/{id}', 'SchoolsController@update')->middleware('admin');
Route::delete('admin/scholen/{id}', 'SchoolsController@destroy')->middleware('admin');
Run Code Online (Sandbox Code Playgroud)
这还不完全是关键,但是当我以具有Approver权限的用户身份登录并尝试访问学校概述时,我陷入困境,它将我重定向回主页.
总的来说,我觉得我的工作过于混乱而且根本不对,有人可以就如何更有效地提供建议吗?
非常感谢你提前!
jfa*_*ich 24
你不应该为每个角色都有一个单独的中间件.它会很快变得非常混乱.最好有一个角色检查中间件,可以检查传递给它的任何角色.
HTTP\Kernel.php
protected $routeMiddleware = [
...
'role' => \App\Http\Middleware\Role::class,
];
Run Code Online (Sandbox Code Playgroud)
HTTP \中间件\ Role.php
public function handle($request, Closure $next, ... $roles)
{
if (!Auth::check()) // I included this check because you have it, but it really should be part of your 'auth' middleware, most likely added as part of a route group.
return redirect('login');
$user = Auth::user();
if($user->isAdmin())
return $next($request);
foreach($roles as $role) {
// Check if user has the role This check will depend on how your roles are set up
if($user->hasRole($role))
return $next($request);
}
return redirect('login');
}
Run Code Online (Sandbox Code Playgroud)
最后在你的网络路线
Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('role:editor,approver');
Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('role:admin');
Run Code Online (Sandbox Code Playgroud)