如何在Laravel 8.x的Backpack管理面板中通过Socialite实现Google登录
1. 基础依赖与配置
- 安装Socialite扩展:
composer require laravel/socialite - 配置Google服务参数,在
config/services.php中追加配置:'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT_URI'), ], - 在项目
.env文件中补充对应参数,参数值从Google Cloud控制台OAuth 2.0凭证页获取,回调地址填写你后台的回调路由,示例:GOOGLE_REDIRECT_URI=https://你的域名/admin/google/callback
2. 适配Backpack认证数据表
- 确认Backpack使用的用户表,默认单独后台用户表为
admins,给表新增google_id(字符串类型,加唯一索引)、avatar(可选,字符串类型,存储头像地址)字段,生成迁移文件:php artisan make:migration add_google_fields_to_admins_table --table=admins - 编辑迁移文件的
up方法:public function up() { Schema::table('admins', function (Blueprint $table) { $table->string('google_id')->nullable()->unique(); $table->string('avatar')->nullable(); }); } - 执行迁移:
php artisan migrate
3. 新增后台路由
在routes/backpack/custom.php(Backpack自定义路由专用文件,不存在可手动创建)中追加路由,继承后台路由组的前缀、中间件配置:
Route::get('google/login', [App\Http\Controllers\Admin\GoogleLoginController::class, 'redirectToGoogle'])->name('admin.google.login'); Route::get('google/callback', [App\Http\Controllers\Admin\GoogleLoginController::class, 'handleGoogleCallback'])->name('admin.google.callback');
4. 编写登录逻辑控制器
创建控制器app/Http/Controllers/Admin/GoogleLoginController.php:
<?php namespace App\Http\Controllers\Admin; use App\Models\Admin; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Laravel\Socialite\Facades\Socialite; class GoogleLoginController extends Controller { public function redirectToGoogle() { return Socialite::driver('google')->redirect(); } public function handleGoogleCallback() { try { $googleUser = Socialite::driver('google')->user(); } catch (\Exception $e) { return redirect()->route('backpack.auth.login')->withErrors(['msg' => 'Google授权失败']); } // 查询是否存在对应用户 $adminUser = Admin::where('google_id', $googleUser->id) ->orWhere('email', $googleUser->email) ->first(); if (!$adminUser) { // 可自定义规则,比如只允许指定域名的邮箱注册后台账号 if (!str_ends_with($googleUser->email, '@你的公司域名.com')) { return redirect()->route('backpack.auth.login')->withErrors(['msg' => '该邮箱无后台访问权限']); } // 新建后台用户 $adminUser = Admin::create([ 'name' => $googleUser->name, 'email' => $googleUser->email, 'google_id' => $googleUser->id, 'avatar' => $googleUser->avatar, 'password' => bcrypt(\Str::random(16)), // 随机密码,不允许密码登录的话可随意生成 ]); } else { // 已有用户更新google_id if (empty($adminUser->google_id)) { $adminUser->update(['google_id' => $googleUser->id]); } } // 调用Backpack的认证方法登录 backpack_auth()->login($adminUser, true); // 跳转到后台首页 return redirect()->route('admin.dashboard'); } }
5. 登录页添加Google登录入口
- 发布Backpack登录视图:
php artisan vendor:publish --provider="Backpack\CRUD\BackpackCRUDServiceProvider" --tag="views" - 编辑发布后的视图文件
resources/views/vendor/backpack/ui/auth/login.blade.php,在原有登录表单下方添加Google登录按钮,链接到{{ route('admin.google.login') }}即可。
注意事项
- 如果开启了Backpack的二次验证功能,需要额外适配登录后的2FA校验逻辑
- 务必添加邮箱权限校验,避免任意Google账号都可登录后台,引发安全问题
- 如果授权时报重定向地址不匹配错误,检查Google Cloud控制台的OAuth授权回调地址和.env中配置的地址是否完全一致
内容的提问来源于stack exchange,提问作者Aaghaaz
相关产品推荐
相关产品推荐

