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。感谢大家的指点。
@TimJuly 是获取当前路由的 guard 不是默认guard,有大佬解惑没?
他这个只能判断登录用户的guard是谁
如果没有一个用户登录,但当前路由有
auth:user
,如何在中间键Authenticate
中获取路由的guard(user)?纯猜测:
服务提供商注册和启动,,,,早于中间件执行,,,然后指定
guard
是在中间件中指定,,,所以,获取不到?
@largezhou 额,无稽之谈
解决方案:

修改中间件
App\Http\Middleware\Authenticate
我也遇到这个问题,在Horizon的Gate授权时,是对后台的
admin
这个guard
授权的。Horizon中的Gate默认是取config/auth.php
中的defaluts
指定的guard
。中途还找到关于Horizon的用户认证的
issues