[英]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.