Laravel 使用 auth()->user() 作为 api

Posted

技术标签:

【中文标题】Laravel 使用 auth()->user() 作为 api【英文标题】:Laravel use auth()->user() for api 【发布时间】:2019-04-06 21:05:11 【问题描述】:

我有很多基于用户权限执行操作的函数。对于网络,一切正常。但我正在慢慢地改变为更多的 ajax 和更少的重新加载页面。但是,我无法在我的 api 控制器中使用我的函数,因为我使用

执行权限检查
auth()->user()->...

我的 api 控制器也可以使用它吗?我知道我可以使用$request->user 访问用户模型,但如果这是唯一的机会,我想我必须复制我的所有功能,一个用于 web,一个用于 api。是否有任何其他更改可以重写我的函数,它们可以通过webapi 控制器执行?

【问题讨论】:

在 API 调用的情况下您还希望进行身份验证检查吗? 值得一提的是,如果auth()->user() 不起作用,$request->user() 也不应该起作用。它们都由身份验证中间件提供。 【参考方案1】:

我认为只要你还在你的 api 路由上使用 'auth:api' 中间件,你应该可以使用 auth()->user() 助手。

更新

auth:api 中间件随 Laravel Passport 一起提供(如果你正在使用它)(我推荐)。

https://laravel.com/docs/5.7/passport#protecting-routes

【讨论】:

【参考方案2】:

API 和 Web 是不同的概念,必须以不同的方式处理身份验证。 据我了解,您希望在 API 部分使用 Web 相关控制器的功能。 如果您用于内部目的,那么您可以在函数中添加其他变量来不检查身份验证(假设您的函数不需要用户相关信息来进行)。 例如:

  function showRecord($api = false)
     if($api)
       //don't authenticate
    else
       //authenticate
    

    //rest of the code here

另一种方式 将常用代码拆分为一个函数,根据您的需要在 api 控制器或 web 控制器中调用。 EG:(所有三个控制器必须在同一个命名空间中,或者如果它们在不同的命名空间中,则必须正确使用它们):

// Controller: CommonController
function myCommonfunction($var)
  //db query or any processing


//function from api controller
function doSomethingApi()
   $ctrl = new CommonController();
   $res = $ctrl->myCommonfunction('test');
   return $res

//function from webcontroller
function doSomething()
   $ctrl = new CommonController();
   $res = $ctrl->myCommonfunction('web');

因此,您将如何处理完全取决于您的应用程序结构。

【讨论】:

以上是关于Laravel 使用 auth()->user() 作为 api的主要内容,如果未能解决你的问题,请参考以下文章

Laravel文档阅读笔记-How to use @auth and @guest directives in Laravel

laravel 的map怎么用

Laravel文档阅读笔记-Custom Authentication Login And Registration Using Laravel 8

Laravel文档阅读笔记-Custom Authentication Login And Registration Using Laravel 8

如何仅检查(状态)活动用户可以登录-JWT Auth-Laravel

laravel5.5用户认证源码分析