You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何构建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

火山引擎 最新活动