Laravel+MySQL登录验证失败:凭据正确却无法登录
Laravel登录验证失败问题
在Laravel框架对接MySQL开发登录页面时,明明登录凭据正确,但LoginController始终执行else分支,无法完成登录,尝试多种方案无效,现附上代码寻求帮助。
LoginController代码
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Session; class LoginController extends Controller { public function login() { if (Auth::check()) { return redirect('home'); }else{ return view('loginKaryawan'); } } public function actionlogin(Request $request) { $data = [ 'username' => $request->input('username'), 'password' => $request->input('password'), ]; if (Auth::attempt($data)) { $karyawan = Auth::user(); return redirect()->route('dashboardMO'); } else { Session::flash('error', 'Username atau Password Salah. Username: ' . $data['username'] . ', Password: ' . $data['password']); return redirect('/'); } } public function actionlogout() { Auth::logout(); return redirect('/'); } }
KaryawanController代码
<?php namespace App\Http\Controllers\Api; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Models\karyawan; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; class karyawanController { /** * Display a listing of the resource. */ public function index() { $karyawan = karyawan::all(); if (count($karyawan) > 0) { return response([ 'message' => 'Retrieve All Success', 'data' => $karyawan ], 200); } return response([ 'message' => 'Empty', 'data' => null ], 400); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $storeData = $request->all(); $validate = Validator::make($storeData, [ 'nama_karyawan' => 'required', 'no_telp' => 'required', 'username' => 'required', 'password' => 'required', 'gaji_karyawan' => 'required', 'bonus' => 'required', ]); if ($validate->fails()) { return response(['message' => $validate->errors()], 400); } $karyawan = karyawan::create($storeData); return response([ 'message' => 'Add karyawan Success', 'data' => $karyawan ], 200); } /** * Display the specified resource. */ public function show(string $id_karyawan) { $karyawan = karyawan::find($id_karyawan); if (!is_null($karyawan)) { return response([ 'message' => 'karyawan found, it is ' . $karyawan->nama_karyawan, 'data' => $karyawan ], 200); } return response([ 'message' => 'karyawan Not Found', 'data' => null ], 404); } /** * Update the specified resource in storage. */ public function update(Request $request, string $id_karyawan) { $karyawan = karyawan::find($id_karyawan); if (is_null($karyawan)) { return response([ 'message' => 'karyawan Not Found', 'data' => null ], 404); } $updateData = $request->all(); $validate = Validator::make($updateData, [ 'nama_karyawan' => 'required', 'no_telp' => 'required', 'username' => 'required', 'password' => 'required', 'gaji_karyawan' => 'required', 'bonus' => 'required', ]); if ($validate->fails()) { return response(['message' => $validate->errors()], 400); } $karyawan->nama_karyawan = $updateData['nama_karyawan']; $karyawan->no_telp = $updateData['no_telp']; $karyawan->username = $updateData['username']; $karyawan->password = $updateData['password']; $karyawan->gaji_karyawan = $updateData['gaji_karyawan']; $karyawan->bonus = $updateData['bonus']; if ($karyawan->save()) { return response([ 'message' => 'Update karyawan Success ', 'data' => $karyawan ], 200); } return response([ 'message' => 'Update karyawan Failed', 'data' => null ], 400); } /** * Remove the specified resource from storage. */ public function destroy(string $id_karyawan) { $karyawan = karyawan::find($id_karyawan); if (is_null($karyawan)) { return response([ 'message' => 'karyawan Not Found', 'data' => null ], 404); } if ($karyawan->delete()) { return response([ 'message' => 'Delete karyawan Success ', 'data' => $karyawan ], 200); } return response([ 'message' => 'Delete karyawan Failed ', 'data' => null ], 400); } }
Web路由代码
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\LoginController; use App\Http\Controllers\HomeController; /* |-------------------------------------------------------------------------- | 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('/', [LoginController::class, 'login'])->name('login'); Route::post('actionlogin', [LoginController::class, 'actionlogin'])->name('actionlogin'); Route::get('dashboardMO', [karyawanController::class,'index'])->name('dashboardMO')->middleware('auth'); Route::get('home', [HomeController::class, 'index'])->name('home')->middleware('auth'); Route::get('actionlogout', [LoginController::class, 'actionlogout'])->name('actionlogout')->middleware('auth');
Karyawan模型代码
<?php namespace App\Models; use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Auth\Authenticatable as AuthenticatableTrait; class karyawan extends Model implements Authenticatable { use HasFactory, AuthenticatableTrait; public $timestamps = false; protected $table = "karyawan"; protected $primaryKey = "id_karyawan"; protected $fillable = [ 'username', 'password', 'nama_karyawan', 'no_telp', 'gaji_karyawan', 'bonus', ]; public function karyawan(){ return $this->belongsTo(karyawan::class, 'id_role'); } }
登录视图loginKaryawan.blade.php代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Login - Atma Kitchen</title> <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"><br> <div class="col-md-4 col-md-offset-4"> <h2 class="text-center"><b>ATMA KITCHEN</b><br>Login Karyawan Atma Kitchen</h3> <hr> @if(session('error')) <div class="alert alert-danger"> <b>Opps!</b> {{session('error')}} </div> @endif <form action="{{ route('actionlogin') }}" method="post"> @csrf <div class="form-group"> <label for="username">Username</label> <input type="text" id="username" name="username" class="form-control" placeholder="Username" required=""> </div> <div class="form-group"> <label for="password">Password</label> <input type="password" id="password" name="password" class="form-control" placeholder="Password" required=""> </div> <button type="submit" class="btn btn-primary btn-block">Log In</button> <hr> <p class="text-center">Lupa Password? <a href="#">Recover</a> </p> </form> </div> </div> </body> </html>
问题原因及解决方案
核心问题:密码未加密存储
Laravel的Auth::attempt()方法默认要求密码是经过哈希加密的,但你的KaryawanController在创建和更新用户时,直接将明文密码存入数据库,导致验证时无法匹配。
具体修复步骤:
修改KaryawanController的store方法:
在创建用户前,对密码进行哈希加密:// 新增密码加密步骤 $storeData['password'] = bcrypt($storeData['password']); $karyawan = karyawan::create($storeData);修改KaryawanController的update方法:
更新用户密码时同样需要加密:// 修改密码为加密后的值 $karyawan->password = bcrypt($updateData['password']);更新数据库中已存在的用户密码:
对于之前已经存入数据库的明文密码,需要手动更新为哈希值。可以通过Laravel Tinker执行:php artisan tinker然后执行:
$user = App\Models\karyawan::find(1); // 替换为目标用户ID $user->password = bcrypt('该用户的明文密码'); $user->save();
其他补充修复:
路由中的dashboardMO缺少控制器命名空间引用,需要在路由文件顶部添加:
use App\Http\Controllers\Api\karyawanController;
内容的提问来源于stack exchange,提问作者Icy
相关产品推荐
相关产品推荐

