欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Laravel admin 调用api时验证用户,Laravel guard 正确使用姿势

程序员文章站 2022-06-27 21:43:07
Guard 是什么? Guard是Laravel 框架权限认证组件的重要组成部分: 1.你的应用可能:分为前端用户和后端管理用户。 2.你的应用可能:既是传统php渲染的html 应用,同时也为其他应用(如:安卓手机应用)提供api接口服务。 这些需求laravel 都帮你考虑到了! 在conf/a ......

guard 是什么?

guard是laravel 框架权限认证组件的重要组成部分:  

  1.你的应用可能:分为前端用户和后端管理用户。

  2.你的应用可能:既是传统php渲染的html 应用,同时也为其他应用(如:安卓手机应用)提供api接口服务。

  这些需求laravel 都帮你考虑到了!

  在conf/auth.php 中guard 可以配置 用户和使用调用中间件(middleware)模式

  它解决了,不同客户在不同环境下(api,web,admin) 使用不同用户角色(前端用户,后端用户)权限认证需求

[
    'guards' => [
        'web' => [ 
            //表示使用web中间件下 使用“session 驱动” 驱动位置:vendor\laravel\framework\src\illuminate\auth\sessionguard.php
            //用户为users --具体定义users模型 在provider中定义 
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            //表示使用api中间件下 使用“token 驱动” 
            //用户为users --具体定义users模型 在provider中定义 
//注意api 没有默认配置 authenticate 中间件-------需要自己手动在 app/http/kernel.php 中添加 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], 'admin' => [ //表示使用admin中间件下 使用“session 驱动” //用户为users --具体定义users模型 在provider中定义 'driver' => 'session', 'provider' => 'admin', ], ] ]

  

顺便讲下用户的数据提供者,它只是定义用户类型,还有指定对应的用户模型

[
    'providers' => [
        //表示users 用户 使用app\user::class模型作为用户模型
        'users' => [
            'driver' => 'eloquent',
            'model' => app\user::class,
        ],
        //当然还可以配置其他用户,比如admin 后台用户
        'admin' => [
            'driver' => 'eloquent',
            'model' => app\admin::class,
        ],
    ]
]

 

使用守卫(guard)方法

指定guard,获取当前会话用户信息

auth::guard('web')->user() 

使用默认 guard,获取当前会话登录信息

auth::user();

注:默认配置在 config/auth.php

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
]

如果是上面的配置,那auth::user() 就相当于 auth::guard('web')->user();

 

 

如何在路由中使用 权限认证?

1.首先要理解 laravel 中间件使用方法:

中间件默认在 app\http\kernel.php 中注册 有以下数组(规则):

注册在 $middleware 数组中的中间件 所有路由每次都会调用

protected $middleware = [
    \app\http\middleware\trustproxies::class,
    \fruitcake\cors\handlecors::class,
    \app\http\middleware\checkformaintenancemode::class,
    \illuminate\foundation\http\middleware\validatepostsize::class,
    \app\http\middleware\trimstrings::class,
    \illuminate\foundation\http\middleware\convertemptystringstonull::class,
];

注册在 $middlewaregroups 数组中的中间件是路由组,一次调用别名其中的中间件都会调用(打包调用)

protected $middlewaregroups = [
    'web' => [
        \app\http\middleware\encryptcookies::class,
        \illuminate\cookie\middleware\addqueuedcookiestoresponse::class,
        \illuminate\session\middleware\startsession::class,
        // \illuminate\session\middleware\authenticatesession::class,
        \illuminate\view\middleware\shareerrorsfromsession::class,
         \app\http\middleware\verifycsrftoken::class,
        \illuminate\routing\middleware\substitutebindings::class,
    ],

    'api' => [
        'throttle:60,1',
        \illuminate\routing\middleware\substitutebindings::class,
    ],
];
注册在 $routemiddleware 数组可以单独使用,也可以配合middlewaregroups  一起使用
protected $routemiddleware = [
    'auth' => \app\http\middleware\authenticate::class,
    'auth.basic' => \illuminate\auth\middleware\authenticatewithbasicauth::class,
    'bindings' => \illuminate\routing\middleware\substitutebindings::class,
    'cache.headers' => \illuminate\http\middleware\setcacheheaders::class,
    'can' => \illuminate\auth\middleware\authorize::class,
    'guest' => \app\http\middleware\redirectifauthenticated::class,
    'password.confirm' => \illuminate\auth\middleware\requirepassword::class,
    'signed' => \illuminate\routing\middleware\validatesignature::class,
    'throttle' => \illuminate\routing\middleware\throttlerequests::class,
    'verified' => \illuminate\auth\middleware\ensureemailisverified::class,
];

 

路由使用用户认证方法(使用默认的auth 中间件方法)

//通过auth中间件使用其中的 ”admin guard”验证中间件 
route::middleware('auth:admin')->get('/', function () {
    return view('welcome');
});

说明:auth:admin

auth 中间件/其中的冒号代表传参,参数为 admin 就是在guard 中注册的 admin 如下:

[
    'admin' => [
        //表示使用admin中间件下 使用“session 驱动” 
        //用户为users --具体定义users模型 在provider中定义 
        'driver'   => 'session',
        'provider' => 'admin',
    ]
]

这个auth:admin代表:

我这个路由需要进行用户认证:认证是否为 admin 用户,根据admin 守卫(guard)的配置,将会调用session模块验证用户

 

laravel authenticate认证流程

laravel 权限认证,全部在authenticate 中间件完成,默认文件在  \app\http\middleware\authenticate.php

通过kernel (注册于  app\http\kernel.php)注入到中间件模块中

它通过guard 模块来实现认证,guard在上面所说的config\auth.php 中注册

 

在authenticate 中使用了 guard 模块来验证用户是否登录:

以下代码片段位于:illuminate\auth\middleware\authenticate

class authenticate implements authenticatesrequests
{
    /**
     * the authentication factory instance.
     *
     * @var \illuminate\contracts\auth\factory
     */
    protected $auth;

    /**
     * create a new middleware instance.
     *
     * @param  \illuminate\contracts\auth\factory  $auth
     * @return void
     */
    public function __construct(auth $auth)
    {
        $this->auth = $auth;
    }
    //...
}

 

当路由组件使用了“auth” 也就是   \app\http\middleware\authenticate::class 中间件时就会触发权限认证

之后的具体操作就有中间件来完成了,比如发现未登录就跳转到登录页

 

 

 

 

实战:laravel-admin 调用查询接口,不允许未登录用户访问api

 在 app/http/kernel.php 中修改api 中间件的使用,因为默认admin guard 使用的session 驱动,所有需要打开 token,session 中间件的支持

protected $middlewaregroups = [
    'web' => [
        \app\http\middleware\encryptcookies::class,//启用token 中间件
        \illuminate\cookie\middleware\addqueuedcookiestoresponse::class,
        \illuminate\session\middleware\startsession::class,//启用session 中间件
        // \illuminate\session\middleware\authenticatesession::class,
        \illuminate\view\middleware\shareerrorsfromsession::class,
         \app\http\middleware\verifycsrftoken::class,//验证csrf 中间件
        \illuminate\routing\middleware\substitutebindings::class,
    ],

    'api' => [
        \app\http\middleware\encryptcookies::class,//新增的 启用token
        \illuminate\session\middleware\startsession::class,//新增的 启用session 中间件
        \app\http\middleware\verifycsrftoken::class,//新增的 启用csrf 中间件
        'throttle:60,1',
        \illuminate\routing\middleware\substitutebindings::class,
    ],
];

 

在路由界面添加需要的路由并在中间件中加上:"admin.auth" 表示使用 admin 权限验证 就ok了

route::middleware('admin.auth')->get('/company', function (request $request) {
    return company::select(['id',"name as text"])->get();
});

 

 

以上均为个人总结,参考网上教程和laravel 相关源码,如有错误和理解问题,欢迎大佬们指正!

原文链接: