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密钥输入和存储密钥,
我该怎么做?!
由于
答案 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',
],
],