You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:23:14