Laravel 8.x使用sqlsrv驱动时Auth::login()无法生效求助
解决Laravel 8.x + SQL Server用户认证无效问题
核心问题排查与修复步骤
1. 显式指定模型主键
Laravel默认期望主键为小写id,但你的表使用大写ID且未在模型中声明,这会导致Auth系统无法正确识别用户主键,进而无法持久化认证状态。
在Usuario模型中补充主键配置:
class Usuario extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; protected $table = 'TB__USUARIO'; // 声明主键字段 protected $primaryKey = 'ID'; // 若ID为自增主键可保留,非自增则设为false public $incrementing = true; // 指定主键数据类型 protected $keyType = 'int'; protected $fillable = [ 'ID', 'NOMBRE', 'CLAVE', 'ESTA_ACTIVO' ]; protected $casts = [ 'ID' => 'integer', 'NOMBRE' => 'string', 'CLAVE' => 'string', 'ESTA_ACTIVO' => 'boolean' ]; }
2. 适配认证字段映射(可选但推荐)
Laravel默认用email作为用户名字段、password作为密码字段,而你的表使用NOMBRE和CLAVE。为了Auth系统兼容性,建议在模型中添加字段映射:
class Usuario extends Authenticatable { // ... 其他代码 // 替换默认用户名字段 public function getAuthIdentifierName() { return 'NOMBRE'; } // 替换默认密码字段 public function getAuthPassword() { return $this->CLAVE; } }
3. 检查会话配置与权限
若上述操作无效,需验证会话相关配置:
- 检查
.env中的SESSION_DRIVER,默认file驱动需确保storage/framework/sessions目录具备读写权限; - 若使用
database会话驱动,需确认会话表已正确迁移至SQL Server。
4. 调试认证流程
在login方法中添加调试代码,确认用户实例的主键有效性:
if ($usuario != null) { // 输出用户ID,验证主键值是否正确 dd($usuario->ID); Auth::login($usuario); // 登录后立即检查认证状态 dd(Auth::check(), Auth::id()); $request->session()->regenerate(); return redirect()->intended('/pedido'); }
如果Auth::check()返回false,说明用户实例未被Auth系统正确识别,需再次检查主键配置或模型继承逻辑。
内容的提问来源于stack exchange,提问作者pedroPG
相关产品推荐
相关产品推荐

