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