zoukankan      html  css  js  c++  java
  • Laravel admin 调用api时验证用户,Laravel guard 正确使用姿势

    Guard 是什么?

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

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

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

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

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

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

    [
        'guards' => [
            'web' => [ 
                //表示使用web中间件下 使用“session 驱动” 驱动位置:vendorlaravelframeworksrcIlluminateAuthSessionGuard.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 驱动” //用户为admin --具体定义admin模型 在provider中定义 'driver' => 'session', 'provider' => 'admin', ], ] ]

      

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

    [
        'providers' => [
            //表示users 用户 使用AppUser::class模型作为用户模型
            'users' => [
                'driver' => 'eloquent',
                'model' => AppUser::class,
            ],
            //当然还可以配置其他用户,比如admin 后台用户
            'admin' => [
                'driver' => 'eloquent',
                'model' => AppAdmin::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 中间件使用方法:

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

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

    protected $middleware = [
        AppHttpMiddlewareTrustProxies::class,
        FruitcakeCorsHandleCors::class,
        AppHttpMiddlewareCheckForMaintenanceMode::class,
        IlluminateFoundationHttpMiddlewareValidatePostSize::class,
        AppHttpMiddlewareTrimStrings::class,
        IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
    ];

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

    protected $middlewareGroups = [
        'web' => [
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            // IlluminateSessionMiddlewareAuthenticateSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
             AppHttpMiddlewareVerifyCsrfToken::class,
            IlluminateRoutingMiddlewareSubstituteBindings::class,
        ],
    
        'api' => [
            'throttle:60,1',
            IlluminateRoutingMiddlewareSubstituteBindings::class,
        ],
    ];
    注册在 $routeMiddleware 数组可以单独使用,也可以配合middlewareGroups  一起使用
    protected $routeMiddleware = [
        'auth' => AppHttpMiddlewareAuthenticate::class,
        'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
        'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,
        'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class,
        'can' => IlluminateAuthMiddlewareAuthorize::class,
        'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
        'password.confirm' => IlluminateAuthMiddlewareRequirePassword::class,
        'signed' => IlluminateRoutingMiddlewareValidateSignature::class,
        'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
        'verified' => IlluminateAuthMiddlewareEnsureEmailIsVerified::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 中间件完成,默认文件在  AppHttpMiddlewareAuthenticate.php

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

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

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

    以下代码片段位于:IlluminateAuthMiddlewareAuthenticate

    class Authenticate implements AuthenticatesRequests
    {
        /**
         * The authentication factory instance.
         *
         * @var IlluminateContractsAuthFactory
         */
        protected $auth;
    
        /**
         * Create a new middleware instance.
         *
         * @param  IlluminateContractsAuthFactory  $auth
         * @return void
         */
        public function __construct(Auth $auth)
        {
            $this->auth = $auth;
        }
        //...
    }

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

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

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

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

    protected $middlewareGroups = [
        'web' => [
            AppHttpMiddlewareEncryptCookies::class,//启用token 中间件
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,//启用session 中间件
            // IlluminateSessionMiddlewareAuthenticateSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
             AppHttpMiddlewareVerifyCsrfToken::class,//验证csrf 中间件
            IlluminateRoutingMiddlewareSubstituteBindings::class,
        ],
    
        'api' => [
            AppHttpMiddlewareEncryptCookies::class,//新增的 启用token
            IlluminateSessionMiddlewareStartSession::class,//新增的 启用session 中间件
            AppHttpMiddlewareVerifyCsrfToken::class,//新增的 启用csrf 中间件
            'throttle:60,1',
            IlluminateRoutingMiddlewareSubstituteBindings::class,
        ],
    ];

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

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

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

    原文链接:https://www.cnblogs.com/zjhblogs/p/12525125.html

  • 相关阅读:
    JavaScript Array 属性 构造器 将数组值转为大写
    Eslint 配置及规则说明
    Vue基于vue-quill-editor富文本编辑器使用心得
    css display:flex 属性
    HTML5本地存储之localStorage、sessionStorage
    图片充满div
    微信小程序 Input框提交后清空
    前端简历怎么写
    响应式与自适应的区别
    JS点击子元素不触发父元素点击事件
  • 原文地址:https://www.cnblogs.com/zjhblogs/p/12525125.html
Copyright © 2011-2022 走看看