laravel-permission使用知识点(慢更)

最近做的项目要用到laravel-permission,之前有了解过,但是是第一次使用这个包,下面记录一些使用时发现的一些点。如有不对,还请各位看官斧正。

中间件校验

  • 使用->middleware("permission:p1")这种校验而auth用的guard不是auth.guards的第一项时需要在用户模型中添加protected $guard_name = 'api'属性(在auth配置文件中设置默认guard是不管用的),下面是分析

    先是关键源码

      /**
          class=> Spatie\Permission\Guard
      */
      /**
       * return collection of (guard_name) property if exist on class or object
       * otherwise will return collection of guards names that exists in config/auth.php.
       * @param $model
       * @return Collection
       */
      public static function getNames($model): Collection
      {
          if (is_object($model)) {
              if (\method_exists($model, 'guardName')) {
                  $guardName = $model->guardName();
              } else {
                  $guardName = $model->guard_name ?? null;
              }
          }
    
          if (!isset($guardName)) {
              $class = is_object($model) ? get_class($model) : $model;
    
              $guardName = (new \ReflectionClass($class))->getDefaultProperties()['guard_name'] ?? null;
          }
    
          if ($guardName) {
              return collect($guardName);
          }
    
          $res = collect(config('auth.guards'))
              ->map(function ($guard) {
                  if (!isset($guard['provider'])) {
                      return;
                  }
    
                  return config("auth.providers.{$guard['provider']}.model");
              })
              ->filter(function ($model) use ($class) {
                  return $class === $model;
              })
              ->keys();
          return $res;
      }
    
      public static function getDefaultName($class): string
      {
          $default = config('auth.defaults.guard');
    
          return static::getNames($class)->first() ?: $default;
      }
    }
    • 解释:简单来说就是获取要使用的guard名,一般来说都会调用config("auth.defaults.guard"),但是laravel-permission是先把auth.guards的键的第一项返回了,而且优先级比默认的guard级别高,所以导致设置的默认guard不生效
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

同遇到过这样的坑

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!