权限篇
2026年1月12日大约 3 分钟
权限篇
- 本篇内容为权限篇,主要讲解如何使用laravel-fast-api-youhujun组件包的权限管理功能
注意
在我们实际项目开发过程中,尤其是现代项目大多是前后端分离,因此laravel自带的web登录验证和权限往往不适用.这个时候就需要自定义,因为这里所说的权限管理,包含着中间件,控制器,授权策略.所以放到此篇来讲
一登录验证
下面我们以后台api接口为例,先看登录验证
配置文件
在config\auth.php中配置guards和providers
//guards中
'admin_token'=>[
'driver'=>'Admin-Token'
],
//providers中
'admin' => [
'driver' => 'eloquent',
'model' => \App\Models\LaravelFastApi\V1\Admin\Admin::class
],授权服务提供者
AuthServiceProvider
注意
不同于其他服务提供者,这里需要继承授权专用服务提供者
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;在
boot方法中注册自定义闭包guard,可以看到这里定义的就是配置文件中的dirver
/**
* 注册管理员守卫
*/
protected function registerAdminTokenGuard(): void
{
//自定义闭包guard 对应 api_token 后台
Auth::viaRequest('Admin-Token', function ($request) {
$api_token = $request->header('X-Token');
$adminObject = null;
if (! $api_token) {
return null;
}
//先从redis 缓存获取
$adminObject = $this->getRedisAdminUserByToken($api_token)
?? $this->getEsAdminUserByToken($api_token)
?? $this->getAdminUserByToken($api_token);
return $adminObject;
});
}中间件
App\Http\Middleware\LaravelFastApi\V1\AdminTokenMiddleware.php 将这个中间件注册为
admin.login
<?php
/*
* @Description:
* @version: v1
* @Author: youhujun youhu8888@163.com & xueer
* @Date: 2025-10-16 11:39:21
* @LastEditors: youhujun youhu8888@163.com & xueer
* @LastEditTime: 2026-05-25 23:08:05
* @FilePath: \youhu-laravel-api-12\app\Http\Middleware\LaravelFastApi\V1\AdminTokenMiddleware.php
* Copyright (C) 2026 youhujun & xueer . All rights reserved.
*/
namespace App\Http\Middleware\LaravelFastApi\V1;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AdminTokenMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$adminObject = Auth::guard('admin_token')->user();
if (empty($adminObject)) {
return response()->json(code(\config('admin_code.AdminTokenError')));
}
$request->attributes->add(['admin' => $adminObject]);
return $next($request);
}
}路由
之后在路由中链式调用->middleware('admin.login'),对于不需要登录状态的接口,在路由中链式调用->withoutMiddleware('admin.login');
以上就完成了登录验证操作
二权限管理
除了结合控制器和中间件实现登录验证,我们还可以使用授权策略来实现权限管理,注意控制器模版中,如下代码就是检测权限
根据用户角色授权
- 控制器中使用
if(Gate::forUser($admin)->allows('admin-role'))
{
}- 服务提供者中定义
//是否是后台管理员
Gate::define('admin-role', function (Admin $adminObject) {
return is_admin($adminObject);
});根据用户自身条件粒度级授权
以相册模块为例
- 控制器中使用
/**
* 更新相册
*
* @param Request $request
* @return void
*/
public function updateAlbum(Request $request)
{
$adminObject = Auth::guard('admin_token')->user();
$result = code(\config('admin_code.apiAuthError'));
if (Gate::forUser($adminObject)->allows('admin-role')) {
$requestDTO = (new UpdateAlbumDTO())->validate($request->all());
// p($requestDTO);
// die;
/**
* @see \App\Policies\LaravelFastApi\V1\Admin\Picture\AlbumPolicy
*/
if (Gate::forUser($adminObject)->allows('update-album', $requestDTO->album_uid)) {
$result = AdminAlbumFacade::updateAlbum($requestDTO, $adminObject);
}
}
return $result;
}- 服务提供者中定义
提示
注意,这种授权方式结合Policy来定义
//更新相册
Gate::define('update-album', [\App\Policies\LaravelFastApi\V1\Admin\Picture\AlbumPolicy::class, 'update']);三 laravel-fast-api 内置的权限管理,是根据角色定义
提示
如下是组件包中内置的权限,根据自身业务需求,可以自行定义其他角色和权限,同时为了业务后续维护和拓展方便,把后台管理员和前端用户权限分开定义
后台
develop-role开发者super-role超级管理员admin-role开发者user-role普通用户
Gate::define('develop-role', function (Admin $adminObject) {
return is_develop($adminObject);
});
//是否是开发者或者超级管理员
Gate::define('super-role', function (Admin $adminObject) {
return is_super($adminObject);
});
//是否是后台管理员
Gate::define('admin-role', function (Admin $adminObject) {
return is_admin($adminObject);
});
//是否是用户
Gate::define('user-role', function (Admin $adminObject) {
return is_user($adminObject);
});客户端
phone-user-role开发者
Gate::define('phone-user-role', function (User $userObject) {
//p(is_phone_user($userObject));die;
return is_phone_user($userObject);
});