Laravel5.7 如何在 AuthServiceProvider 获取当前 guard_name
业务场景:
使用laravel5.7版本基于Permission开发了一个后台管理系统,在实现多guard(路由守卫)进行不同的权限节点认证。
思路:
1、在AuthServiceProvider里面使用Gate::define当前登录用户所具有的权限。
public function boot() {
$this->registerPolicies(); //注册
//gate 定义\ $this->gateDefine();
}
/**
* gate 定义用户的权限列表
*/
public function gateDefine() {
//1、调用这个函数 获取刚才上图那样的所有菜单操作列表
$permissions = $this->getPermissions();
//2、定义gate 规则
foreach ($permissions as $permission) {//遍历---赋予授权规则
//$user指当前登录用户模型实例,
$name = $permission->name;
Gate::define($name, function ($user) use($name) {
return $user->hasPermissionTo($name);
});
}
}
/**
* 获取所有的权限信息
* @return arrray 权限列表
*/
public function getPermissions() {
$guard = Guard::getDefaultName(self::class);
return Permission::where(['guard_name'=>$guard])->with('roles')->get(); //将与之对应的关联用户组也查出来
}
2、添加一个中间件role,在路由请求之前验证是否具有操作权限。
public function handle($request, Closure $next)
{
//如果当前用户是超级管理员 那么什么权限都有 就直接跳过 contains 是集合的一个方法 看里面有没有 ['name'=>'超级管理员']这玩意
if (Auth::user()->roles->contains('name', '超级管理员')) {
return $next($request);
}
//超级管理员也可以
if (Auth::user()->name == 'admin') {
return $next($request);
}
//定义的规则 判断的字段为 false就 满足条件 毕竟是deny 否定嘛
if (Gate::denies(Route::currentRouteName())) {
return response()->json([
'status' => 'failure',
'code' => 403,
'msg' => '您没有权限执行此操作~'
]);
}
//没有被拦截就正常访问
return $next($request);
}
遇到的问题:
使用这种方法在多个guard中无法获取当前传递的guard_name
Route::group(['middleware' => ['auth:corp']], function() {
//这里是路由名称
}
请问如何获取到当前的guard(corp),如果换成
Route::group(['middleware' => ['auth:api']], function() {
//这里是路由名称
}
这里获取的guard就是 api。感谢大家的指点。
推荐文章: