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

如何在Laravel 8.x的Backpack管理面板中通过Socialite实现Google登录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:45:03