Laravel为两者提供了Auth变量 - api令牌和基于会话的身份验证

时间:2016-07-27 11:48:56

标签: laravel authentication laravel-5.2

我正在使用laravel 5.2

最近,我已更新Auth模块,以便基于session进行基于身份验证和基于api_token的外部API调用身份验证。

现在,我发现在使用基于Auth::id()身份验证的Auth::user()api_token时出错。因此我不得不使用Auth::guard('api')->id()Auth::guard('api')->user()方法。

现在,我的问题是,无论基于api_token的身份验证还是基于session,我都可以使用任何常用方法吗?那么auth()->user()auth()->id()怎么样?

如果我使用any方法进行两种身份验证怎么办?例如,methodA()在基于api_token的身份验证以及基于session的身份验证中使用,如果我需要使用Auth变量,我该如何处理?

1 个答案:

答案 0 :(得分:1)

我认为处理常规请求(通过基于会话的身份验证)的控制器应该与api控制器(基于令牌的身份验证)分开。因此,每个控制器都对单个功能部分负责。此外,api控制器中的更改不会在会话控制器中产生副作用。因此,您可以在每个控制器中明确指定auth guard。 Laravel需要明确指定防护,否则将使用默认防护。没有办法聪明地猜测本地使用什么防护装置。当然,你可以做这样的事情:

public function action(Request $request)
{
    $guard = $request->has('api_token') ? 'api' : 'session';
    $authUser = Auth::guard($guard)->user();

    //your code next
}

如果您使用单独的控制器,则可以将常用功能概括为父抽象控制器。请注意,在下面的示例中,ChildControllers仅与命名空间不同。 父:

<?php

namespace App\Http\Controllers\Api

use App\Http\Controllers\Controller;

abstract class ParentController extends Controller
{
    public function action(Request $request)
    {
        $authUser = Auth::guard($this->guard)->user();

        //your code...
    }
}

API控制器:

<?php

namespace App\Http\Controllers\Api

use App\Http\Controllers\ParentController

class ChildController extends ParentController
{
    protected $guard = 'api';

    //your code...
}

会话控制器:

<?php

namespace App\Http\Controllers\Session

use App\Http\Controllers\ParentController

class ChildController extends ParentController
{
    protected $guard = 'session';

    //your code...
}