簡體   English   中英

Laravel 8 身份驗證:auth::attemp 始終返回 false

[英]Laravel 8 Authentication: auth::attemp always return false

我正在使用 Laravel 8 並嘗試對用戶進行身份驗證(登錄)

我的 model:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Auth\Authenticatable;
class AccountModel extends Model implements AuthenticatableContract
{
    use HasFactory;
    use Authenticatable;
    protected $table='Accounts';
    protected $primaryKey= 'Username';
    public $incrementing = false;
    protected $fillable = ['Username','Password','RoleID','RegisteredAt','Status','updated_at','created_at'];
    public function getAuthPassword()
    {
        return $this->Password; 
    }
    public function getAuthIdentifier()
    {
        return $this->Username; 
    }
    protected $hidden = [
        'remember_token'
    ];        
}

我的 controller

<?php
namespace App\Http\Controllers\Admin;
use App\Models\AccountModel;
use App\Http\Controllers\Controller;
use Illuminate\Routing;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Cookie;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;

class LogInController extends Controller
{
    function index()
    {
        return view('Admin.LogIn');
    }
    public function Username()
    {
        return 'Username';
    }
    function loginaction($usn,$pw)
    {
        $credentials = [
            'Username'=>$usn,
            'password'=>$pw,
        ];
            if (Auth::guard('admin')->attempt($credentials)) {
                $credentials->cookie()->regenerate();
                return redirect()->intended('/Admin/Home');
            }
            else
                return $credentials;
    }

config/auth.php

<?php

return [
    'defaults' => [
        'guard' => 'admin',
        'passwords' => 'admin',
    ],
    'guards' => [
        'admin' => [
            'driver' => 'session',
            'provider' => 'admin',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'admin',
            'hash' => false,
        ],
    ],
    'providers' => [
        'admin' => [
            'driver' => 'eloquent',
            'model' => App\Models\AccountModel::class,
        ],
    ],


    'passwords' => [
        'admin' => [
            'provider' => 'admin',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],


    'password_timeout' => 10800,

];

遷移

<?php

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

class CreateAccountsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('Accounts', function (Blueprint $table) {
            $table->string('Username');
            $table->string('Password');
            $table->int('RoleID');
            $table->timestamp('RegisteredAt');
            $table->string('Status');
            $table->timestamp('updated_at');
            $table->timestamp('created_at');
        });
    }

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

Blade(Ajax 工作,數據發送)

  <div class="wrap-input100 validate-input" id="typeusername" data-validate="Nhập tên đăng nhập">
            <input class="input100" id="usn" type="text" name="username" placeholder="Username">
            <span class="focus-input100" data-placeholder="👨‍"></span>
            <p class="error-login" style="color:red;font-size:13px;display:none;"> ! Chưa nhập tên đăng nhập </p>
        </div>
        <div class="wrap-input100 validate-input" id="typepassword" data-validate="Nhập mật khẩu">
            <input class="input100" id="psw" type="password" name="pass" placeholder="Password">
            <span class="focus-input100" data-placeholder="🔒"></span>
            <p class="error-login" style="color:red;font-size:13px;display:none;"> ! Chưa nhập mật khẩu </p>
        </div>
<div class="container-login100-form-btn">
            <button class="login100-form-btn" onclick="login()">Login</button>
        </div>
<script>
    function login()
    {
        var usn = $("#usn").val();
        var pass = $("#psw").val();
         $.get("{{route('bLogIn')}}/" + usn +"/" + pass , function (res) {
                if (res =='Fail')
                { 
                    $(".alerterror").css("display", "block");
                } 
                else
                    window.location.href = "{{route('bHome')}}";
            });
    }
</script>

我正在使用 Ajax 將數據從視圖發送到 controller。 它發送了,controller 有它,我的代碼還使用 Where 子句檢查正確的表 - 我保存在我的 MySQL 數據庫中的“帳戶”。 用戶名和密碼存在,但嘗試仍然返回 false。

誰能告訴我為什么它不能成功運行?

我認為您使用不同的字段名稱作為密碼。默認情況下,它的小寫字母password ,但在您的情況下,第一個字母是大寫Password ,因此您可以定義如下所示的訪問器

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

更新我已經使用以下測試並解決了。 您的Account model應實現以下方法

 public function getAuthIdentifierName()
    {
        return $this->Username;
    }

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

在你的 controller 你應該使用

 $credentials = [
            'Username'=>"test",
            'password'=>"admin@123",
        ];

在傳遞密碼字段時,它應該是小寫,然后您的 model 方法將根據 model class 將其轉換為

更新的答案

賬戶模型

<?php
namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;


class AccountModel extends   Authenticatable
{
    use HasFactory, Notifiable;

    protected $table='accounts';
    protected $primaryKey= 'Username';
    public $incrementing = false;
    protected $fillable = ['Username','Password','RoleID','RegisteredAt','Status','updated_at','created_at'];
    protected $hidden = [
        'remember_token'
    ];
  //  protected $guard = 'admin';


    public function getAuthIdentifier(){
        return $this->Username;
    }
    public function getAuthIdentifierName()
    {
        return $this->Username;
    }

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

}

在 Controller

 $credentials = [
            'Username'=>"test",
            'Password'=>"admin@123",
        ];

        if (Auth::attempt($credentials)) {
          //  $credentials->cookie()->regenerate();
           dd(auth()->user());
        }
        else
            return $credentials;

我修好了它。 因為在我的 EloquentUserProvider 中,密碼在檢查之前經過哈希處理,因此至少需要 60 個字符。 我認為沒有必要,所以我改為比較 2 個字符串 function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM