Laravel非默认数据库多用户创建及跨库登录问题求助
Laravel多用户表(非默认users)登录实现问题
已实现Laravel默认users表的用户登录功能,现在需基于Lansia模型对应的lansias表实现登录,遇到功能无法正常工作的问题,相关代码如下:
AuthController代码
public function loginAksi(Request $request) { if ($request->email == null or $request->password == null) { return redirect()->back()->with(['error' => 'Masukkan Email atau Password !']); } else { if (Auth::attempt([ 'email' => $request->email, 'password' => $request->password ])) { $user = Auth::user(); if($user->level == 1){ return redirect()->route('admin.dashboard')->with(['success' => 'Selamat Datang']); } elseif($user->level == 0){ return redirect()->route('user'); } else { return redirect()->route('userlansia'); } } else { return redirect()->back()->with(['error' => 'Login Gagal !']); } } }
Lansia模型代码
protected $fillable = [ 'id_lansia', 'nama_lansia', 'tempat_lahir', 'tgl_lahir', 'alamat', 'No_tlp', 'NIK', 'No_BPJS', 'email', 'password', 'level', 'user' ]; protected $table = 'lansias'; protected $primaryKey = 'id_lansia';
auth.php配置
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ],
kernel.php中间件配置
protected $routeMiddleware = [ 'admin' => \App\Http\Middleware\AdminMiddleware::class, 'user' => \App\Http\Middleware\UserMiddleware::class, 'userlansia' => \App\Http\Middleware\LansiaMiddleware::class, ];
解决方案步骤
1. 扩展auth.php配置,新增lansia的guard和provider
修改config/auth.php,添加针对lansias表的认证守卫和提供者:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 新增lansia守卫 'lansia' => [ 'driver' => 'session', 'provider' => 'lansias', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], // 新增lansias提供者 'lansias' => [ 'driver' => 'eloquent', 'model' => App\Lansia::class, // 对应你的Lansia模型路径 ], ],
2. 调整Lansia模型,实现认证接口
Laravel的认证系统要求模型实现Authenticatable接口,修改Lansia模型:
<?php namespace App; use Illuminate\Foundation\Auth\User as Authenticatable; // 引入认证基类 class Lansia extends Authenticatable { protected $fillable = [ 'id_lansia', 'nama_lansia', 'tempat_lahir', 'tgl_lahir', 'alamat', 'No_tlp', 'NIK', 'No_BPJS', 'email', 'password', 'level', 'user' ]; protected $table = 'lansias'; protected $primaryKey = 'id_lansia'; // 隐藏敏感字段(可选但推荐) protected $hidden = [ 'password', 'remember_token', ]; }
3. 修改登录逻辑,指定使用lansia守卫
在AuthController的loginAksi方法中,明确指定使用lansia守卫进行认证:
public function loginAksi(Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); // 使用lansia守卫尝试登录 if (Auth::guard('lansia')->attempt([ 'email' => $request->email, 'password' => $request->password ])) { $user = Auth::guard('lansia')->user(); if($user->level == 1){ return redirect()->route('admin.dashboard')->with(['success' => 'Selamat Datang']); } elseif($user->level == 0){ return redirect()->route('user'); } else { return redirect()->route('userlansia'); } } else { return redirect()->back()->with(['error' => 'Login Gagal !']); } }
4. 调整中间件(如果需要)
如果你的userlansia中间件需要验证当前登录的是lansia用户,修改中间件逻辑:
public function handle(Request $request, Closure $next) { // 检查lansia守卫是否已认证 if (!Auth::guard('lansia')->check()) { return redirect()->route('login'); } return $next($request); }
注意事项
- 创建Lansia用户时,密码必须用
Hash::make()加密存储,例如:Lansia::create([ // 其他字段 'password' => Hash::make('your_password'), ]); - 如果需要退出登录,要指定对应的守卫:
Auth::guard('lansia')->logout();
内容的提问来源于stack exchange,提问作者Lanz King
相关产品推荐
相关产品推荐

