You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中创建带独立认证的APP用户表方法咨询

嘿,这个需求我之前在项目里实现过,Laravel的多认证体系其实挺灵活的,按下面的步骤一步步来就能搞定:

实现Laravel多用户表(管理员+APP用户)认证方案

1. 创建APP用户的模型与数据库迁移

首先用Artisan命令快速生成模型和对应的迁移文件:

php artisan make:model AppUser -m

打开database/migrations下刚生成的迁移文件,修改up()方法,添加APP用户需要的核心字段(可以根据你的业务需求调整,比如手机号、昵称等):

public function up()
{
    Schema::create('app_users', function (Blueprint $table) {
        $table->id();
        $table->string('name')->nullable(); // 用户昵称
        $table->string('phone')->unique(); // 用手机号作为登录标识,也可以换成email
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

执行迁移生成数据表:

php artisan migrate

接着修改App\Models\AppUser模型,让它继承Laravel的认证基类,并配置好基础属性:

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class AppUser extends Authenticatable
{
    use Notifiable;

    // 指定数据表名(模型名和表名对应时可省略,这里是app_users)
    protected $table = 'app_users';

    // 允许批量填充的字段
    protected $fillable = [
        'name', 'phone', 'password',
    ];

    // 隐藏敏感字段
    protected $hidden = [
        'password', 'remember_token',
    ];

    // 指定该模型使用的认证守卫
    protected $guard = 'app_user';
}

2. 配置认证守卫与用户提供者

打开config/auth.php,在guards数组里新增APP用户专属的守卫:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users', // 对应原有的管理员user表
    ],

    'app_user' => [
        'driver' => 'session', // 如果是APP API认证,可换成token/sanctum
        'provider' => 'app_users',
    ],
],

然后在providers数组里新增APP用户的提供者:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],

    'app_users' => [
        'driver' => 'eloquent',
        'model' => App\Models\AppUser::class,
    ],
],

如果需要支持APP用户的密码重置功能,在passwords数组里添加对应的配置:

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],

    'app_users' => [
        'provider' => 'app_users',
        'table' => 'app_password_resets', // 建议单独建表,避免和管理员混淆
        'expire' => 60,
        'throttle' => 60,
    ],
],

如果用单独的密码重置表,需要新建迁移并执行:

php artisan make:migration create_app_password_resets_table

迁移文件内容示例:

public function up()
{
    Schema::create('app_password_resets', function (Blueprint $table) {
        $table->string('phone')->index(); // 对应APP用户的登录字段
        $table->string('token');
        $table->timestamp('created_at')->nullable();
    });
}

3. 生成APP用户的认证控制器与路由

如果你的项目用了laravel/ui,可以先复制原有的认证控制器,修改成APP用户专属的版本:
比如复制app/Http/Controllers/Auth/LoginController.php为AppUserLoginController.php,修改核心逻辑:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;

class AppUserLoginController extends Controller
{
    use AuthenticatesUsers;

    // 登录成功后的跳转路径
    protected $redirectTo = '/app/dashboard';

    // 指定使用APP用户的认证守卫
    protected function guard()
    {
        return auth()->guard('app_user');
    }

    // 重写登录字段(这里用phone代替默认的email)
    public function username()
    {
        return 'phone';
    }

    // 构造方法:未登录的APP用户才能访问登录页
    public function __construct()
    {
        $this->middleware('guest:app_user')->except('logout');
    }

    // 重写退出方法,确保清除APP用户的会话
    public function logout(Request $request)
    {
        $this->guard()->logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        return redirect('/app/login');
    }
}

同理复制RegisterController.php为AppUserRegisterController.php,修改验证规则和用户创建逻辑:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Models\AppUser;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class AppUserRegisterController extends Controller
{
    use RegistersUsers;

    protected $redirectTo = '/app/dashboard';

    protected function guard()
    {
        return auth()->guard('app_user');
    }

    public function __construct()
    {
        $this->middleware('guest:app_user');
    }

    // 重写注册验证规则
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'phone' => ['required', 'string', 'max:11', 'unique:app_users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    // 重写创建APP用户的方法
    protected function create(array $data)
    {
        return AppUser::create([
            'name' => $data['name'],
            'phone' => $data['phone'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

最后在routes/web.php(API认证用routes/api.php)里配置APP用户的认证路由:

// APP用户专属认证路由
Route::prefix('app')->group(function () {
    Route::get('/login', [App\Http\Controllers\Auth\AppUserLoginController::class, 'showLoginForm'])->name('app.login');
    Route::post('/login', [App\Http\Controllers\Auth\AppUserLoginController::class, 'login']);
    Route::post('/logout', [App\Http\Controllers\Auth\AppUserLoginController::class, 'logout'])->name('app.logout');

    Route::get('/register', [App\Http\Controllers\Auth\AppUserRegisterController::class, 'showRegistrationForm'])->name('app.register');
    Route::post('/register', [App\Http\Controllers\Auth\AppUserRegisterController::class, 'register']);
});

4. 保护APP用户的专属路由

用auth:app_user中间件来保护APP用户的私有路由,确保只有登录的APP用户才能访问:

Route::prefix('app')->middleware('auth:app_user')->group(function () {
    Route::get('/dashboard', function () {
        return view('app.dashboard');
    })->name('app.dashboard');
    // 其他APP用户专属路由
});

管理员的路由则继续用auth或auth:web中间件保护,互不干扰。

5. 视图调整(Web端APP用户可选)

如果是Web端的APP用户,复制原有的认证视图到resources/views/app/auth目录下,修改成符合APP用户的样式,然后在控制器里指定视图路径,比如在AppUserLoginController的showLoginForm方法里:

public function showLoginForm()
{
    return view('app.auth.login');
}

小提示

  • 如果是APP API认证,推荐用Laravel Sanctum或Passport,把守卫驱动改成sanctum或token即可。
  • 密码重置时,若用手机号作为标识,需要在AppUser模型里重写sendPasswordResetNotification方法,确保通知发送到手机号而非邮箱。

内容的提问来源于stack exchange,提问作者sadiq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:07:28