如何更改令牌保护

时间:2017-09-20 10:28:45

标签: php mysql laravel authentication laravel-5.5

Laravel 5.5

我想改变 TokenGaurd 中使用的api令牌的方向,所以, 我创建了一个名为 CafeTokenGaurd 的自定义守卫扩展TokenGuard,我将__construct函数定义为我想要的东西,如下所示:

public function __construct(UserProvider $provider, Request $request) {
        parent::__construct($provider, $request);
        $this->inputKey = 'api_key'; // I want changing this part
        $this->storageKey = 'api_key';
    }

现在我想从与用户表的关系定义api_key,如下所示:

device_user table -> token

我想为用户拥有的每个设备定义特定的令牌,我想在用户和设备之间的数据透视表中为此列设置api密钥输入和存储密钥,

我该怎么做?!

由于

2 个答案:

答案 0 :(得分:4)

由于您需要更改用户从数据库中检索的方式,因此您实际上需要创建并使用自定义UserProvider,而不是自定义Guard。如果您想从api_token重命名输入密钥或存储密钥,则您只需要自定义防护。

因此,您需要一个新的自定义UserProvider类,该类知道如何使用给定的凭据(令牌)检索您的用户,并且您需要告诉Auth使用新的自定义UserProvider类。

首先,假设您仍在使用Eloquent,请首先创建一个扩展基础UserProvider类的新EloquentUserProvider类。在此示例中,它是在app/Services/Auth/MyEloquentUserProvider.php创建的。在本课程中,您需要覆盖retrieveByCredentials函数,并详细说明如何使用提供的令牌检索用户。

namespace App\Services\Auth;

use Illuminate\Auth\EloquentUserProvider;

class MyEloquentUserProvider extends EloquentUserProvider
{
    /**
     * Retrieve a user by the given credentials.
     *
     * @param  array  $credentials
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function retrieveByCredentials(array $credentials)
    {
        if (empty($credentials)) {
            return;
        }

        // $credentials will be an array that looks like:
        // [
        //     'api_token' => 'token-value',
        // ]

        // $this->createModel() will give you a new instance of the class
        // defined as the model in the auth config for your application.

        // Your logic to find the user with the given token goes here.

        // Return found user or null if not found.
    }
}

一旦您创建了课程,您需要让Auth了解它。您可以在boot()服务提供商的AuthServiceProvider方法中执行此操作。这个例子将使用名称" myeloquent",但你可以使用你想要的任何东西(除了#34; eloquent"和"数据库")。

public function boot()
{
    $this->registerPolicies();

    Auth::provider('myeloquent', function($app, array $config) {
        return new \App\Services\Auth\MyEloquentUserProvider($app['hash'], $config['model']);
    });
}

最后,您需要告诉Auth使用新的myeloquent用户提供商。这是在config/auth.php配置文件中完成的。

'providers' => [
    'users' => [
        'driver' => 'myeloquent', // this is the provider name defined above
        'model' => App\User::class,
    ],
],

您可以在documentation here中了解有关添加自定义用户提供程序的详情。

答案 1 :(得分:3)

Laravel 5.7.28版以来,您只需在config/auth.php中进行设置。

'guards' => [
    'api' => [
        'driver' => 'token',
        'input_key' => 'token',   // The input name to pass through
        'storage_key' => 'token', // The column name to store in database
        'provider' => 'users',
    ],
],