【问题标题】:Laravel 7 multiple auth rolesLaravel 7 多个身份验证角色
【发布时间】:2021-03-10 09:26:22
【问题描述】:

我正在尝试为网站制作自定义身份验证角色,我关注了另一个堆栈溢出帖子,似乎可以让它工作,但我的总是失败,我知道信息存在,因为我将信息转储并在一次身份验证后将信息消亡到屏幕上: :guard 失败。问题是即使信息存在 auth guard 也失败了

if (Auth::guard('Admin')->attempt(['Username' => $Request->input('UName'), 'Password' => $Request->input('Password')]))

信息经过验证和批准并设法通过

 if (Admins::where('Username', $Request->input('UName'))->exists()) {
            $AdminDetails = Admins::Where('Username', $Request->input('UName'))->first();
            if(Hash::check($Request->input('Password'), $AdminDetails->Password)){
                   //user details are correct
            }
  }

我已经使用户和管理员都可以验证上面的代码尝试授权管理员,我还更改了 config/auth.php 文件,如下所示

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
        'Admin' => [
            'driver' => 'session',
            'provider' => 'Admin',
        ],
        'User' => [
            'driver' => 'session', 
            'provider' => 'User',
        ],
    ],
'providers' => [
        'User' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
        'Admin' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admins::class,
        ]

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

模型位于正确的命名空间中,如下所示,管理员可验证

<?php
namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admins extends Authenticatable
{
    use Notifiable;

    protected $guard = 'Admin';

    protected $fillable = [
        'FName', 'LName', 'Email', 'Password', 'Username'
    ];

    protected $hidden = [
        'password'
    ];
}

并且用户可验证

<?php

namespace App\Models;


use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Users extends Authenticatable
{
    use Notifiable;

    protected $guard = 'User';

    protected $fillable = [
        'FullName', 'Email', 'CompanyName','ReferedBy','PhoneNumber','MemberStatus','CustomMessage',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];
}

Laravel 7 不显示任何错误或任何内容,但尝试登录用户的 if 语句失败

管理模型的迁移也是

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateAdminsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->id();
            $table->string('Username');
            $table->string('FName');
            $table->string('LName');
            $table->string('Email');
            $table->string('Password');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('admins');
    }
}

我知道在一个问题中包含大量信息,但我知道这都与问题相关。 感谢您提供的任何帮助。

【问题讨论】:

    标签: php laravel authentication roles laravel-7


    【解决方案1】:

    将凭据数组传递给Auth::attempt 时,保存密码的元素必须 命名为password,它与表中的任何字段名称都没有关系。这就是用户提供者知道哪个字段应该是“密码”的方式,因为它需要进行哈希检查;凭据中除 password 之外的所有其他字段都是查询的 WHERE 条件。

    ['Username' => ..., 'password' => ...]
    

    如果您的模型/表使用除 password 之外的其他字段作为密码,您将必须通过定义 getAuthPassword 方法来告诉模型:

    public function getAuthPassword()
    {
        return $this->Password;
    }
    

    【讨论】:

    • 该模型使用密码而不是密码,所以如果我将 p 更改为小写,问题将得到解决?
    • 如果您将表的字段更改为 password 并调整凭证数组,那么您不必自己定义 getAuthPassword 方法,因为它将使用默认值,即password字段
    • 谢谢 这在 Laravel 中很常见还是例外。无论哪种方式,我都会开始使用小写字母,谢谢您的帮助。
    • 您可以根据需要命名字段,但如果该特定字段不是password,则必须让身份验证系统知道这一点,因为默认情况下getAuthPassword 返回@987654333 的值@ field ...但是是的,小写的字段很常见
    猜你喜欢
    • 2020-12-26
    • 2015-05-31
    • 2013-05-16
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多