gpt4 book ai didi

laravel - 如何为 Laravel 5.7 创建自定义 Auth Guard/Provider

转载 作者:行者123 更新时间:2023-12-04 15:48:54 26 4
gpt4 key购买 nike

我正在从 Laravel 4 迁移到 5.7,但在使用自定义身份验证提供程序时遇到了问题。我遵循了各种演练(例如 123 )以及相当多的谷歌搜索。

我试图通过以下方式使其工作:

设置 guard 和提供者并链接到我的目标模型。


'defaults' => [
'guard' => 'custom_auth_guard',
'passwords' => 'users',
],

'guards' => [

'custom_auth_guard' => [
'driver' => 'session',
'provider' => 'custom_auth_provider',
],
],

'providers' => [

'custom_auth_provider' => [
'driver' => 'custom',
'model' => App\UserAccount::class,
],
],

注册上述提供程序中定义的驱动程序。我正在捎带 AuthServiceProvider 以方便使用

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

\Auth::provider('custom',function() {
return new App\Auth\CustomUserProvider;
});
}
...

创建了我的自定义提供程序,其中包含我的retrieveByCredentials 等。我用一些 die() 替换了逻辑以验证它是否在这里制作。在 Laravel 4 中,它曾经使用过 validateCredentials()。

class CustomUserProvider implements UserProviderInterface {

public function __construct()
{
die('__construct');
}

public function retrieveByID($identifier)
{
die('retrieveByID');
}

public function retrieveByCredentials(array $credentials)
{
die('retrieveByCredentials');
}

public function validateCredentials(\Illuminate\Auth\UserInterface $user, array $credentials)
{
die('validateCredentials');
}

作为引用,App/UserAccount 看起来像这样
class UserAccount extends Authenticatable
{
use Notifiable;

/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'public.user_account';

// no updated_at, created_at
public $timestamps = false;

private $_roles = [];
private $_permissions = [];
}

最后,我通过我的 Controller 调用它。
        if(\Auth::attempt($credentials){
return \Redirect::intended('/dashboard');
}

我也试过直接给守卫打电话
        if(\Auth::guard('custom_auth_guard')->attempt($credentials){
return \Redirect::intended('/dashboard');
}

这会导致以下错误: "Auth guard [custom_auth_guard] is not defined."
我尝试了一些其他命令以确保没有缓存问题:
composer update
php artisan cache:clear

结果:当我调用 Auth::attempt($credentials) 时,Laravel 试图在用户表上运行查询。预期的结果是它会命中 CustomUserProvider 中的 die() 之一...或者至少尝试查询模型中定义的 public.user_account 。

我一直在搞这个,我一定错过了一些简单的东西......希望在 Laravel 5 中有更多经验的人可以看到我做错了什么。

提前致谢!!

最佳答案

设法解决了。几个小问题,但主要问题是我试图搭载 AuthServiceProvider 而不是我自己的提供者。以下是我为让自定义身份验证提供程序在 Laravel 5.7 中工作所做的工作

在 config.auth.php 中设置提供者。

'providers' => [

'user' => [
'driver' => 'eloquent',
'model' => \UserAccount::class,
],
],

在 app/providers/中创建一个新的提供者。这将上面列出的提供者与正确的用户提供者代码联系起来。
namespace App\Providers;

use Auth;
use App\Auth\CustomUserProvider;
use Illuminate\Support\ServiceProvider;

class CustomAuthProvider extends ServiceProvider
{

public function register()
{
//
}

public function boot()
{
Auth::provider('eloquent',function()
{
return new CustomUserProvider(new \UserAccount());
});
}
}

在 app/auth/中创建了我的自定义提供程序。这是验证用户的逻辑,并替换了 auth 的 Laravel 函数。我在这里遇到了一个问题,它正在验证但没有填充用户对象。我最初有一个测试,看看对象是否为空,如果是,则填充...但是它总是填充一个空对象。删除测试允许我调用 Auth::user() 函数。
namespace App\Auth;

use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use Illuminate\Auth\EloquentUserProvider;

class CustomUserProvider implements EloquentUserProvider{

public function __construct()
{
$this->user = $user;
}

public function retrieveByID($identifier)
{
$this->user = \UserAccount::find($identifier);
return $this->user;
}

public function retrieveByCredentials(array $credentials)
{
// find user by username
$user = \UserAccount::where('name', $credentials['username'])->first();

// validate
return $user;
}

public function validateCredentials(\Illuminate\Auth\UserInterface $user, array $credentials)
{
//logic to validate user
}

更新的 App/Models/UserAccount 看起来像这样
use Illuminate\Foundation\Auth\User as Authenticatable;
class UserAccount extends Authenticatable
{
protected $table = 'public.user_account';

// no updated_at, created_at
public $timestamps = false;

private $_roles = [];
private $_permissions = [];
}

就是这样。我现在可以通过以下调用进行验证
        if(\Auth::attempt($credentials){
return \Redirect::intended('/dashboard');
}

关于laravel - 如何为 Laravel 5.7 创建自定义 Auth Guard/Provider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54706877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com