【问题标题】:multi auth not working in laravel 5.1多重身份验证在 laravel 5.1 中不起作用
【发布时间】:2017-01-07 23:08:03
【问题描述】:

我正在使用 Laravel 5.1,并且我需要在我的项目中进行多次登录,因此我正在尝试 Kbwebs\MultiAuthSarav\Multiauth 进行多重身份验证,两者都与 用户模型 模型,但不幸的是,当我使用 TenderApplicant 模型时,Auth::attempt 每次都返回 false。

这是我的代码:

app.php

'providers' => [

    /*
     * Laravel Framework Service Providers...
     */
    Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
    Illuminate\Auth\AuthServiceProvider::class,
    Sarav\Multiauth\MultiauthServiceProvider::class,
    ...

auth.php

return [
'multi' => [
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
        'table' => 'sa_users',
    ],
    'user' => [
        'driver' => 'eloquent',
        'model'  => App\Models\TenderApplicant::class,
        'table'  => 'tender_applicant',
    ],
],
'password' => [
    'email'  => 'emails.password',
    'table'  => 'sa_password_resets',
    'expire' => 60,
],

];

AuthController.php

class AuthController extends Controller
{

use AuthenticatesAndRegistersUsers, ThrottlesLogins;

public function __construct()
{
    $this->middleware('guest', ['except' => 'getLogout']);
}

public function userAuth(Request $request)
{
    $this->validate($request, ['email' => 'required','password' => 'required']);

    $email      = $request->input('email');
    $password   = $request->input('password');
    var_dump(Auth::attempt("user", ['email' => 'awal.ashu@gmail.com', 'password' => '123456']));
}

为用户返回 false,但管理员工作完美。

TenderApplicant.php

namespace App\Models;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class TenderApplicant extends Model implements AuthenticatableContract, CanResetPasswordContract
{
    use Authenticatable, CanResetPassword;
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table      = 'tender_applicant';
    protected $primaryKey = 'TE_APP_ID';
    const CREATED_AT      = 'CREATED_AT';
    const UPDATED_AT      = 'UPDATED_AT';

    protected $fillable = [
                        'TENDER_ID', 
                        'SCHEDULE_ID', 
                        'PR_DETAIL_ID', 
                        'NID', 
                        'PR_CATEGORY', 
                        'PR_TYPE', 
                        'APPLICANT_NAME',
                        'EMAIL',  
                        'APPLICANT_PHONE', 
                        'PASSWORD', 
                        'HOLDING_NO', 
                        'IS_TE_SC_BOUGHT', 
                        'TE_SC_AMOUNT', 
                        'TE_SC_DATE', 
                        'SPOUSE_NAME', 
                        'BID_AMOUNT',
                        'BG_AMOUNT', 
                        'BG_AMOUNT_TEXT',
                        'BANK_ID',
                        'B_DRAFT_NO', 
                        'B_DRAFT_DATE', 
                        'B_DRAFT_ATTACHMENT', 
                        'IS_SELECTED', 
                        'IS_ACTIVE', 
                        'CREATED_BY', 
                        'UPDATED_BY'
                    ];

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = ['TE_APP_ID'];

    /**
     * Password need to be all time encrypted.
     *
     * @param string $password
     */
    public function setPasswordAttribute($password)
    {
        $this->attributes['PASSWORD'] = bcrypt($password);
    }
}

【问题讨论】:

  • 你能在这里给我们用户表中的行吗?
  • 这是用户表的详细信息:protected $table = 'sa_users';受保护的 $primaryKey = 'USER_ID';常量 CREATED_AT = 'CREATED_AT';常量 UPDATED_AT = 'UPDATED_AT'; protected $fillable = ['USER_TYPE', 'FIRST_NAME', 'LAST_NAME', 'FULL_NAME', 'GENDER', 'USERNAME', 'EMAIL', 'PASSWORD', 'MOBILE_NO', 'IS_ACTIVE', 'CREATED_BY', ' UPDATED_BY'];
  • 我的意思是,您是否检查过密码哈希是否正确(Auth::hash())以及用户是否存在于 sa_users 表中
  • 是的用户存在于 sa_users 表和class 'Sarav\Multiauth\Guard' does not have a method 'hash' 这不是我的问题,当我使用用户模型时它可以工作,但我无法使用 TenderApplicant 模型登录。我不知道错误在哪里。我刚刚从 Auth::attempt(); 返回 false即使是在tender_applicant 表中的用户和密码也是正确的
  • 我会在 Git repo 上打开问题。如果您找到解决方案,请告诉我们

标签: laravel laravel-5.1 multi-tenant


【解决方案1】:

默认情况下,Laravel 不让您将密码字段保留为“密码”。如果您更改(您保留为 PASSWORD),您必须通知 Laravel 您的密码字段更改。

请将以下代码添加到您的 TenderApplicant.php 文件并检查

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

然后尝试如下访问,

Auth::attempt('admin', ['EMAIL' => 'youremail@gmail.com', 'password' => 'your_password']); 

注意:您不必在此处将您的 password 更改为 PASSWORD,因为我们已经在模型中定义了我们的方法。

  1. 当你尝试 Auth::attempt() 时,laravel 将运行以下查询

    SELECT * FROM "your_auth_table" WHERE email = "given_email" LIMIT 1

  2. 然后根据得到的结果,laravel 将从得到的结果中取出密码字段,该字段将被哈希。
  3. 然后它将从模型中调用 getAuthPassword() 方法并获取您提供的密码字段。默认情况下,它将是“密码”。现在有了php函数 密码验证 ,laravel 将使用用户给定的纯文本验证您的哈希密码并启动用户会话

有关更多信息,您可以查看此博客。

http://blog.sarav.co/laravel-password-management-mechanism/

【讨论】:

  • 终于成功了 :),谢谢@Saravanan Sampathkumar。
  • 登录成功后,Auth::user() return NULL。有什么我错过了@Saravanan Sampathkumar 的吗?
  • 是的。对于管理员登录,您必须调用 Auth::user('admin') :)
  • 好的,但是对于管理员Auth::user() return 所有数据。为什么用户不能?事件我不能使用Authenticate Middleware :(
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2015-02-25
  • 2016-10-21
  • 2016-05-13
相关资源
最近更新 更多