Laravel 10自定义MSSQL用户表及字段后登录失败问题
我为用户表自定义了名称和字段,数据库使用MSSQL。表名为TUsers,字段采用PascalCase命名,具体如下:
- 用
Email替代默认的email - 用
Password替代默认的password - 其他字段如created_at、updated_at和remember_token也做了对应调整
注册功能正常,且注册后会通过Auth::login()自动登录用户
尝试登录时返回错误提示:"这些凭证与我们的记录不匹配。"
我也尝试自定义LoginController并使用Auth::attempt方法,仍遇到相同问题
- 也尝试过使用
bcrypt()
我在User模型中添加了以下配置:
public $table = "TUsers"; protected $primaryKey = 'TUserID'; const EMAIL = 'Email'; const PASSWROD = 'Password'; const CREATED_AT = 'CreatedAt'; const UPDATED_AT = 'UpdatedAt'; public function getAuthPassword() { return $this->Password; } protected $fillable = [ 'Name', 'Email', 'Password', 'EmailVerifiedAt' ]; protected $hidden = [ 'Password', 'RememberToken', ]; protected $casts = [ 'EmailVerifiedAt' => 'datetime', 'Password' => 'hashed', ];
我还对auth.php做了如下调整:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', 'credentials' => [ 'email' => 'Email', 'password' => 'Password' ] ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'PasswordResets', 'expire' => 60, 'throttle' => 60, ], ],
我还尝试创建了自定义TUserProvider:
<?php namespace App\Providers; use Illuminate\Contracts\Auth\UserProvider; use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Support\Facades\DB; class TUsersProvider implements UserProvider { public function retrieveById($identifier) { return DB::table('TUsers')->where('TUserID', $identifier)->first(); } public function retrieveByToken($identifier, $token) { return DB::table('TUsers')->where('TUserID', $identifier)->where('RememberToken', $token)->first(); } public function retrieveByCredentials(array $credentials) { // Retrieve a user by their credentials ('Email' and validate the 'Password') $user = DB::table('TUsers')->where('Email', $credentials['Email'])->first(); if ($user && password_verify($credentials['Password'], $user->Password)) { return $user; } return null; } public function validateCredentials(Authenticatable $user, array $credentials) { return password_verify($credentials['Password'], $user->getAuthPassword()); } public function updateRememberToken(Authenticatable $user, $token) { DB::table('TUsers')->where('TUserID', $user->getAuthIdentifier())->update([ 'RememberToken' => $token, ]); } }
并在AuthServiceProvider中添加了以下代码:
$this->app['auth']->provider('tusers', function ($app, array $config) { return new TUsersProvider($app['hash'], $config['model']); });
同时在auth.php中将guards.web下的provider参数更新为'tusers'。
但此时出现错误:
Illuminate\Auth\SessionGuard::__construct(): Argument #2 ($provider) must be of type Illuminate\Contracts\Auth\UserProvider, null given, called in /var/www/html/clients/markj/iatse-new/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 127
我创建了另一个空白Laravel 10项目,连接MySQL数据库,仅调整$fillable和以下函数就成功实现登录:
public function getAuthPassword() { return $this->Password; }
但最初的MSSQL项目仍无法正常登录,我无法理解原因。
内容的提问来源于stack exchange,提问作者John Doe

