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

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

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

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

【问题讨论】:

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

标签: php laravel laravel-authorization


【解决方案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');
    }
    



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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-05
      • 2023-04-04
      • 2017-03-29
      • 2018-08-11
      • 2021-07-29
      • 2023-02-04
      • 2016-02-02
      • 2016-08-11
      相关资源
      最近更新 更多