Laravel /schools路由配置isSuperAdmin中间件实现指定超管访问咨询
Laravel 接口鉴权规则实现方案
鉴权目标
需要落地的判定逻辑:仅同时满足两个条件的账号可访问/schools GET接口
- 当前登录用户ID为1
- 当前登录用户持有
super_admin角色
现有路由配置兼容说明
当前路由组挂载的can:isSuperAdmin是Laravel框架内置的授权校验中间件,本身不需要单独编写中间件类,只需要在授权规则中定义isSuperAdmin对应的判定逻辑即可,完全适配现有代码结构,不需要修改已写好的路由组配置。
核心配置步骤
1. 定义授权规则
打开app/Providers/AuthServiceProvider.php,在boot方法中写入对应授权判定逻辑:
namespace App\Providers; use App\Models\User; use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider { // 原有配置... public function boot() { // 注册isSuperAdmin授权判定规则 Gate::define('isSuperAdmin', function (User $user) { // 双条件严格校验 return $user->id === 1 && $user->hasRole('super_admin'); }); } }
2. 补充User模型的关联方法
根据项目使用的权限实现方式,补充对应的模型代码:
场景A:自定义角色关联(无第三方权限扩展)
需要先定义Role模型,在User模型中配置多对多关联、增加角色判断辅助方法:
// app/Models/User.php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { // 原有模型配置... // 定义用户与角色的多对多关联 public function roles() { return $this->belongsToMany(Role::class, 'user_role', 'user_id', 'role_id'); } // 角色存在判断辅助方法 public function hasRole(string $roleName): bool { return $this->roles()->where('name', $roleName)->exists(); } }
场景B:使用权限扩展包实现角色体系
只需要在User模型中引入扩展包提供的trait,即可直接使用内置的hasRole方法,不需要额外写关联逻辑:
// app/Models/User.php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { // 引入权限trait,自动关联角色、权限方法 use HasRoles; // 原有模型配置... }
生效排查注意事项
- 保持当前路由的中间件执行顺序:
JwtMiddleware->auth:api->can:isSuperAdmin。必须保证auth:api先执行完成,才能在后续授权校验中拿到已登录的用户实例,若顺序颠倒会因为无法获取登录用户触发鉴权失败 - 不要遗漏用户ID=1的硬校验逻辑,避免仅靠角色判断放开过高权限
- 不需要额外单独编写中间件类,现有
can中间件搭配Gate规则的实现方式和原有路由配置完全兼容
内容的提问来源于stack exchange,提问作者user15240617
相关产品推荐
相关产品推荐

