laravel-permission使用知識點(慢更)

gema發表於2020-11-09

最近做的專案要用到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 協議》,轉載必須註明作者和本文連結