我正在开发一个 Laravel 项目,将项目从 codeigniter 迁移到 laravel,因此我使用多重防护身份验证和自定义管理员用户表,名为 tbl_admin_user,其中电子邮件和密码列均名为 admin_user_email_id 和 admin_user_password,而不是默认密码。
但目前我遇到了这个错误——我猜是字段名称没有映射,而且我不知道为什么它甚至能通过更新查询,而且哈希密码与我数据库中的密码不相似。这个错误在 attempt() 方法中突出显示。
我有一个自定义的守卫管理员和一个自定义的 Office 模型,它们扩展了 Authenticatable。以下是我所做的 :
namespace App\Models;
use Illuminate\Support\Facades\Hash;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Office extends Authenticatable
{
use HasFactory, Notifiable;
protected $table = 'tbl_admin_user';
protected $primaryKey = 'admin_user_id';
public $incrementing = true;
public $keyType = 'int';
protected $fillable = [
// other column names
'admin_user_email_id',
'admin_user_password',
// other column names
'admin_updated_on',
'admin_created_on',
];
// Use customized field name
public function getAuthIdentifierName() {
return 'admin_user_email_id';
}
// Gets the hashed password
public function getAuthPassword() {
return $this->admin_user_password;
}
public $timestamps = false;
}
控制器的登录功能
// Begin::Authenticate login
public function authenticateOfficeLogin(Request $request) {
// validate
$validate = $request->validate([
'admin_user_email_id' => 'required|email',
'admin_user_password' => 'required'
]);
// Store credentials
$credentials = [
'admin_user_email_id' => $validate['admin_user_email_id'],
'password' => $validate['admin_user_password'],
'admin_user_status' => 1,
];
$user = Office::where('admin_user_email_id', $request->admin_user_email_id)->first(); // Gets the matching data
// Check if user is authenticated
if($user) {
$authenticate = Auth::guard('admin')->attempt($credentials); // Here i got the error
// if authenticated
if($authenticate) {
return redirect()->route('office.dashboard')->with('success','Logged In Successfully!'); // redirect to the dashboard
}
}
}
// End::Authenticate login
我尝试过的方法:使用 php artisan config:clear、route:clear 和 cache:clear 清除配置和路由缓存,甚至尝试优化:clear。
在 Auth::attempt() 调用之前添加了 Log::info() 语句,但未记录任何内容。
在 attempt() 调用之前,使用 dd() 中的 Hash::check() 验证提供的密码是否与散列密码匹配,现在它返回 true。