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。感谢大家的指点。

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
TimJuly
auth()->getDefaultDriver()
5个月前 评论

@TimJuly 是获取当前路由的 guard 不是默认guard,有大佬解惑没?

4个月前 评论
auth()->getDefaultDriver()

他这个只能判断登录用户的guard是谁
如果没有一个用户登录,但当前路由有auth:user,如何在中间键Authenticate中获取路由的guard(user)?

4个月前 评论

纯猜测:

服务提供商注册和启动,,,,早于中间件执行,,,然后指定 guard 是在中间件中指定,,,

所以,获取不到?

4个月前 评论

@largezhou 额,无稽之谈

解决方案:
修改中间件App\Http\Middleware\Authenticate
file

4个月前 评论
largezhou 4个月前
drinke9

我也遇到这个问题,在Horizon的Gate授权时,是对后台的admin这个guard授权的。Horizon中的Gate默认是取config/auth.php中的defaluts指定的guard

修改config/auth.php中的默认看守为admin就可以了。

中途还找到关于Horizon的用户认证的issues

2个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!