如何构建Laravel多库分离的管理员与普通用户登录应用?
嘿,这个需求我之前在项目里实践过,给你整理一套完整的实现方案,一步步来很清晰:
Laravel双数据库双用户登录实现方案
1. 先搞定多数据库连接配置
首先修改config/database.php,给普通用户数据库加一套独立连接配置:
'connections' => [ // 默认管理员数据库(保留原有配置即可) 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'admin_db'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, ], // 新增普通用户数据库连接 'mysql_user' => [ 'driver' => 'mysql', 'host' => env('DB_USER_HOST', '127.0.0.1'), 'port' => env('DB_USER_PORT', '3306'), 'database' => env('DB_USER_DATABASE', 'user_db'), 'username' => env('DB_USER_USERNAME', 'root'), 'password' => env('DB_USER_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, ], ],
然后在.env文件里补充对应的环境变量:
# 普通用户数据库配置 DB_USER_HOST=127.0.0.1 DB_USER_PORT=3306 DB_USER_DATABASE=user_db DB_USER_USERNAME=root DB_USER_PASSWORD=
2. 创建两个独立的用户模型
给管理员和普通用户各做一个模型,分别绑定对应的数据库:
- 管理员模型
app/Models/Admin.php:
namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class Admin extends Authenticatable { use Notifiable; // 绑定管理员数据库的users表 protected $table = 'users'; // 显式指定使用默认的mysql连接(其实可以省略,因为默认就是它) protected $connection = 'mysql'; // 管理员专属字段,按需调整 protected $fillable = ['name', 'email', 'password', 'is_super_admin', 'admin_role']; protected $hidden = ['password', 'remember_token']; }
- 普通用户模型
app/Models/User.php:
namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; // 绑定普通用户数据库的users表 protected $table = 'users'; // 指定使用普通用户数据库连接 protected $connection = 'mysql_user'; // 普通用户专属字段,按需调整 protected $fillable = ['name', 'email', 'password', 'phone', 'address', 'user_level']; protected $hidden = ['password', 'remember_token']; }
3. 配置双认证守卫
修改config/auth.php,为两类用户分别配置守卫和提供者:
'guards' => [ // 管理员专属守卫 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], // 普通用户守卫(保留原web守卫即可) 'web' => [ 'driver' => 'session', 'provider' => 'users', ], ], 'providers' => [ // 管理员用户提供者 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], // 普通用户提供者 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], ],
4. 自定义两套登录控制器
分别生成管理员和普通用户的登录控制器,各自处理对应的认证逻辑:
- 普通用户登录控制器
app/Http/Controllers/Auth/UserLoginController.php:
namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; class UserLoginController extends Controller { use AuthenticatesUsers; // 普通用户登录后跳转的页面 protected $redirectTo = '/'; public function __construct() { // 只允许未登录的普通用户访问登录页 $this->middleware('guest:web')->except('logout'); } // 指定使用普通用户守卫 protected function guard() { return auth()->guard('web'); } // 显示普通用户登录页面 public function showLoginForm() { return view('auth.user-login'); } // 普通用户退出逻辑 public function logout(Request $request) { $this->guard()->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/login'); } }
- 管理员登录控制器
app/Http/Controllers/Auth/AdminLoginController.php:
namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; class AdminLoginController extends Controller { use AuthenticatesUsers; // 管理员登录后跳转的后台页面 protected $redirectTo = '/admin/dashboard'; public function __construct() { // 只允许未登录的管理员访问登录页 $this->middleware('guest:admin')->except('logout'); } // 指定使用管理员守卫 protected function guard() { return auth()->guard('admin'); } // 显示管理员登录页面 public function showLoginForm() { return view('auth.admin-login'); } // 管理员退出逻辑 public function logout(Request $request) { $this->guard()->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/admin/login'); } }
5. 设置对应的路由
在routes/web.php里配置两套登录路由,区分开普通用户和管理员的访问路径:
// 普通用户登录路由 Route::get('/login', [App\Http\Controllers\Auth\UserLoginController::class, 'showLoginForm'])->name('login'); Route::post('/login', [App\Http\Controllers\Auth\UserLoginController::class, 'login']); Route::post('/logout', [App\Http\Controllers\Auth\UserLoginController::class, 'logout'])->name('logout'); // 管理员登录&后台路由 Route::prefix('admin')->group(function () { Route::get('/login', [App\Http\Controllers\Auth\AdminLoginController::class, 'showLoginForm'])->name('admin.login'); Route::post('/login', [App\Http\Controllers\Auth\AdminLoginController::class, 'login']); Route::post('/logout', [App\Http\Controllers\Auth\AdminLoginController::class, 'logout'])->name('admin.logout'); // 后台需要认证的路由,统一用admin守卫保护 Route::middleware('auth:admin')->group(function () { Route::get('/dashboard', function () { return view('admin.dashboard'); })->name('admin.dashboard'); // 其他后台路由都放在这里 }); });
6. 制作两套登录视图
复制默认的登录视图,分别修改成普通用户和管理员的登录页面:
- 普通用户登录视图
resources/views/auth/user-login.blade.php:调整页面标题为“用户登录”,样式按需优化 - 管理员登录视图
resources/views/auth/admin-login.blade.php:调整页面标题为“管理员登录”,可以加上后台专属标识
7. 权限控制的小细节
- 需要普通用户认证的路由,使用
auth:web中间件:
Route::middleware('auth:web')->group(function () { Route::get('/profile', function () { return view('user.profile'); }); });
- 需要管理员认证的路由,使用
auth:admin中间件(就像上面后台路由配置的那样) - 在代码中需要获取不同用户时,可以这样调用:
// 获取当前登录的普通用户 auth()->guard('web')->user(); // 获取当前登录的管理员 auth()->guard('admin')->user();
内容的提问来源于stack exchange,提问作者Robert Kujawa




