# 权限篇
- 本篇内容为权限篇,主要讲解如何使用laravel-fast-api组件包的权限管理功能
注意
在我们实际项目开发过程中,尤其是现代项目大多是前后端分离,因此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
//自定义闭包guard 对应 api_token 后台
Auth::viaRequest('Admin-Token', function ($request)
{
$api_token = $request->header('X-Token');
$admin = null;
if($api_token)
{
//先从redis 缓存获取 用户
$admin = $this->getAdminUserByToken($api_token);
if(empty( $admin) || !isset($admin))
{
//如果缓存不存在 表示用户已经退出了,重新从数据库获取
$admin = \App\Models\LaravelFastApi\V1\Admin\Admin::where('remember_token', $api_token)->first();
}
}
return $admin;
});
# 中间件
App\Http\Middleware\LaravelFastApi\V1\AdminTokenMiddleware.php 将这个中间件注册为
admin.login
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$admin = Auth::guard('admin_token')->user();
if(empty($admin))
{
return response()->json(code(\config('admin_code.AdminTokenError')));
}
$request->attributes->add(['admin'=>$admin]);
return $next($request);
}
# 路由
之后在路由中链式调用->middleware('admin.login')
,对于不需要登录状态的接口,在路由中链式调用->withoutMiddleware('admin.login');
以上就完成了登录验证操作
# 二权限管理
除了结合控制器和中间件实现登录验证,我们还可以使用授权策略来实现权限管理,注意控制器模版中,如下代码就是检测权限
# 根据用户角色授权
- 控制器中使用
if(Gate::forUser($admin)->allows('admin-role'))
{
}
- 服务提供者中定义
//是否是后台管理员
Gate::define('admin-role',function($admin)
{
return $admin->isAdmin();
});
# 根据用户自身条件粒度级授权
以相册模块为例
- 控制器中使用
public function updateAlbum(Request $request)
{
$admin = Auth::guard('admin_token')->user();
$result = code(\config('admin_code.apiAuthError'));
if(Gate::forUser($admin)->allows('admin-role'))
{
$validator = Validator::make(
$request->all(),
[
'id'=>['bail',new Required,new Numeric],
'album_type'=>['bail',new Required,new Numeric],
'album_name' => ['bail',new Required,new CheckString,new CheckBetween(1,30),new ChineseCodeNumberLine],
'album_description' => ['bail','nullable',new CheckBetween(0,50)],
'sort'=>['bail',new Required,new Numeric],
],
[]
);
$validated = $validator->validated();
/**
* @see \App\Policies\Admin\Picture\AlbumPolicy
*/
if(Gate::forUser($admin)->allows('update-album',[$validated]))
{
$result = AdminAlbumFacade::updateAlbum($validated,$admin);
}
}
return $result;
}
- 服务提供者中定义
TIP
注意,这种授权方式结合Policy来定义
//更新相册
Gate::define('update-album', [\App\Policies\LaravelFastApi\V1\Admin\Picture\AlbumPolicy::class, 'update']);
# 三 laravel-fast-api 内置的权限管理,是根据角色定义
TIP
如下是组件包中内置的权限,根据自身业务需求,可以自行定义其他角色和权限,同时为了业务后续维护和拓展方便,把后台管理员和前端用户权限分开定义
# 后台
develop-role
开发者super-role
超级管理员admin-role
开发者user-role
普通用户
Gate::define('develop-role',function($admin)
{
return $admin->isDevelop();
});
//是否是开发者或者超级管理员
Gate::define('super-role',function($admin)
{
return $admin->isSuper();
});
//是否是后台管理员
Gate::define('admin-role',function($admin)
{
return $admin->isAdmin();
});
//是否是用户
Gate::define('user-role',function( $admin)
{
return $admin->isUser();
});
# 前台
phone-user-role
开发者
Gate::define('phone-user-role',function($user)
{
return $user->isUser();
});