Laravel中创建带独立认证的APP用户表方法咨询
嘿,这个需求我之前在项目里实现过,Laravel的多认证体系其实挺灵活的,按下面的步骤一步步来就能搞定:
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

