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 开发相关的进阶知识。
讨论数量: 5
TimJuly
auth()->getDefaultDriver()
1个月前 评论

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

1周前 评论
auth()->getDefaultDriver()

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

1周前 评论
largezhou

纯猜测:

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

所以,获取不到?

1周前 评论

@largezhou 额,无稽之谈

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

1周前 评论
largezhou: 楼主是说要在 ServiceProvider 中获取吧,,,中间件里面,肯定可以获取到啊,,, 1周前

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

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会