# 权限篇

  • 本篇内容为权限篇,主要讲解如何使用laravel-fast-api组件包的权限管理功能

注意

在我们实际项目开发过程中,尤其是现代项目大多是前后端分离,因此laravel自带的web登录验证和权限往往不适用.这个时候就需要自定义,因为这里所说的权限管理,包含着中间件,控制器,授权策略.所以放到此篇来讲

# 一登录验证

下面我们以后台api接口为例,先看登录验证

# 配置文件

config\auth.php中配置guardsproviders

//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();
});
Last Updated: 3/11/2025, 11:12:18 AM