如何解决Laravel8 基于角色的访问使用数据透视表和中间件
我正在尝试使用 laravel8 编写一个大型项目,并且需要基于角色的访问权限。所以我创建了一个角色表并通过一个名为 role_user 的模式表将它链接到用户表。现在我可以在控制器和用户模型中创建访问并执行检查,并且一切正常 我的问题是,通过这种方式,我必须不断检查用户是否可以访问我所有用户访问级别的每个功能,这很乏味。
因此,我尝试转换此方法并使用中间件,但问题是我无法在身份验证后将用户重定向到适当的仪表板,并且它们都被重定向到仅为用户指定的主页。
我已经尝试了以下
-
我已将以下代码添加到用户模型中,以在用户和角色之间创建多对多关系,并检查用户是否具有角色并按照代码块执行适当的任务
public function roles() { return $this->belongsToMany(Role::class); } public function checkRoles($roles) { if ( ! is_array($roles)) { $roles = [$roles]; return false; } if ( ! $this->hasAnyRole($roles)) { auth()->logout(); abort(404); } } public function hasAnyRole($roles): bool { return (bool) $this->roles()->whereIn('name',$roles)->first(); } public function hasRole($role): bool { return (bool) $this->roles()->where('name',$role)->first();
} 现在,如果我直接对每个控制器的模型进行 peforem 检查,但是在为每个角色创建中间件并在每个角色中执行检查之后,事情会失败
-
a) 管理中间件
public function handle(Request $request,Closure $next){ if (Auth::user() && $request->user()->hasRole('admin')) { return $next($request); } return redirect('home')->with('error','You have not admin access'); }
-
b) 超级管理员中间件
public function handle(Request $request,Closure $next) { if (Auth::user() && $request->user()->hasRole('super_admin')) { return $next($request); } return redirect('home')->with('error','You have not permission to peform this task'); }
-
现在在Kernel类里面注册了所有的中间件之后,我修改了loginController类,在construct函数里面加入了如下代码:
if(Auth::check()){ if(Auth::user()->hasRole('super_admin')){ return redirect(RouteServiceProvider::SUPERADMINADMINHOME); }elseif(Auth::user()->hasRole('admin')){ return redirect(RouteServiceProvider::ADMINHOME); }elseif(Auth::user()->hasRole('vendor')){ return redirect(RouteServiceProvider::VENDORHOME); }else { return redirect(RouteServiceProvider::HOME); } }
-
我也更新了我的路线如下
Route::group(['prefix' => 'super','as' => 'super.','namespace' => 'Super','middleware' => ['Super']],function () { Route::get('/',[App\Http\Controllers\SuperAdminController::class,'index'])->name('superadminhome'); }); Route::group(['prefix' => 'admin','as' => 'admin.','namespace' => 'Admin','middleware' => ['Admin']],function () { Route::get('/',[App\Http\Controllers\AdminController::class,'index'])->name('adminhome'); }); Route::group(['prefix' => 'vendor','as' => 'vendor.','namespace' => 'Vendor','middleware' => ['Vendor']],[App\Http\Controllers\VendorController::class,'index'])->name('vendorhome'); });
完成所有这些之后,我尝试使用超级管理员凭据和管理员凭据登录,但所有这些都将我带到了同一主页。我可能做错了什么,或者在哪里可以获得有关如何完成此任务的分步指南,请注意我是 laravel 中间件的新手。
解决方法
据我所知,您遇到了这个问题,因为检查结果都是假的,因此将最后一个考虑在内。这意味着您检查角色的方式可能是错误的。我建议遍历角色并使用 switch 语句。检查它是否与您需要的匹配,然后适当地重定向。 这意味着更改检查特定角色可用性的 if 语句。 这是你代码的这一部分
{'LeagueID': '00','Season': '2013-14','SeasonType': 'Regular Season'}
{'LeagueID': '00','Season': '2014-15','Season': '2015-16','SeasonType': 'Playoffs'}
{'LeagueID': '00','SeasonType': 'Playoffs'}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。