Laravel auth()与attempt()助手函数登录验证失效问题
Laravel 登录认证持续返回「Invalid login details」问题
问题现象
- 用户注册功能可正常将数据写入数据库
- 登录操作始终返回Invalid login details错误提示
- 先后替换
!auth()->attempt($request->only('email','password'))、!Auth::attempt两种写法均无法解决,无法定位错误原因
项目相关代码
LoginController 代码
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class LoginController extends Controller { public function __construct(){ $this->middleware(['guest']); } public function login(){ return view('login.login'); } public function logindetails(Request $request){ request()->validate([ 'email' => 'required|email', 'password' => 'required' ]); if(!auth()->attempt($request->only('email','password'))){ return back()->with('status','Invalid login details'); } return redirect('home'); } }
login.blade.php 视图文件代码
<html> <head> </head> <body> @if(session('status')) <article style="color:red;">{{ session('status') }}</article><br> @endif <form method="post" action="\logindetails"> @csrf <input type="text" name="email" placeholder="email" @error('email') style="border-color:red;" @enderror value="{{ old('email') }}"><br> @error('email') {{$message}} <br> @enderror <input type="password" name="password" placeholder="password" @error('password') style="border-color:red;" @enderror><br> @error('password') {{$message}} <br> @enderror <input type="submit" name="submit" value="submit"> </form> </body> </html>
web.php 路由文件代码
<?php use App\Http\Controllers\AdminController; use App\Http\Controllers\LoginController; use App\Http\Controllers\LogoutController; use App\Http\Controllers\RegisterController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/home',[AdminController::class,'index']); Route::get('/add',[AdminController::class,'add'])->middleware('auth'); Route::post('/addpost',[AdminController::class,'addpost']); Route::get('/edit/{post}',[AdminController::class,'edit']); Route::post('/editpost/{post}',[AdminController::class,'editpost']); Route::get('/delete/{post}',[AdminController::class,'deletepost']); Route::post('/logout',[LogoutController::class,'logout']); Route::get('/login',[LoginController::class,'login'])->name('login'); Route::post('/logindetails',[LoginController::class,'logindetails']); Route::get('/register',[RegisterController::class,'register']); Route::post('/registerdetails',[RegisterController::class,'registerdetails']);
问题排查与修复方案
核心原因(90%概率):注册时密码未做哈希处理
Laravel 自带的attempt()认证逻辑,会自动对前端传入的明文密码做 bcrypt/argon2 哈希计算,再和数据库中存储的密码哈希值做比对。如果注册逻辑中直接把明文密码存入数据库,哈希值和明文永远无法匹配,就会持续返回认证失败。
修复方式:检查
RegisterController的registerdetails方法,创建用户时必须对密码字段做哈希处理:
// 错误写法(直接存明文) User::create([ 'email' => $request->email, 'password' => $request->password, // 其余字段 ]); // 正确写法 User::create([ 'email' => $request->email, 'password' => bcrypt($request->password), // 也可使用Hash::make($request->password) // 其余字段 ]);
如果之前已经存入了明文密码的测试用户,直接删除该用户重新走注册流程即可。
其余排查点
- 检查
app/Models/User.php模型:确认$fillable批量赋值白名单中包含email和password字段,避免密码字段未被正确写入数据库;确认模型中没有为password字段设置多余的修改器/访问器篡改字段值。 - 检查数据库users表结构:password字段长度至少设置为60位(推荐设为255位),长度不足会导致哈希值被截断,比对失败。
- 修正现有代码的不规范写法:
- LoginController的验证逻辑统一使用注入的
$request实例,把request()->validate()改为$request->validate(),避免多请求实例不一致的潜在问题。 - 视图中表单action的反斜杠为多余字符,把
action="\logindetails"改为action="/logindetails",或使用action="{{ url('/logindetails') }}"避免路由匹配异常。 - 认证通过后建议添加
$request->session()->regenerate();逻辑,修复会话固定风险。
- LoginController的验证逻辑统一使用注入的
内容的提问来源于stack exchange,提问作者Patrick Esguerra
相关产品推荐
相关产品推荐

