如何配置Laravel Backpack 6实现管理员与客户双面板分表授权
解决Laravel Backpack多独立面板(管理员+客户)配置方案
不用依赖nWidart模块,直接利用Backpack原生的多面板支持就能实现需求,具体步骤如下:
1. 配置多Guard与认证Provider
修改config/auth.php,新增针对admins和clients表的Guard和Provider:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 管理员专属Guard 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], // 客户专属Guard 'client' => [ 'driver' => 'session', 'provider' => 'clients', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 管理员认证Provider 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], // 客户认证Provider 'clients' => [ 'driver' => 'eloquent', 'model' => App\Models\Client::class, ], ],
2. 配置Backpack双面板
修改config/backpack/base.php,在panels数组中添加两个独立面板的配置:
'panels' => [ // 管理员面板配置 'admin' => [ 'guard' => 'admin', 'route_prefix' => 'admin', 'namespace' => 'App\Http\Controllers\Backpack\Admin', 'view_namespace' => 'backpack::admin', 'home' => 'dashboard', 'login' => [ 'route' => 'backpack.admin.login', 'view' => 'backpack::auth.login', ], ], // 客户面板配置 'client' => [ 'guard' => 'client', 'route_prefix' => 'client', 'namespace' => 'App\Http\Controllers\Backpack\Client', 'view_namespace' => 'backpack::client', 'home' => 'dashboard', 'login' => [ 'route' => 'backpack.client.login', 'view' => 'backpack::auth.login', ], ], ],
3. 创建对应模型与认证控制器
- 分别创建
Admin和Client模型,关联对应数据表:
// App\Models\Admin.php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; class Admin extends Authenticatable { protected $table = 'admins'; protected $fillable = ['name', 'email', 'password']; } // App\Models\Client.php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; class Client extends Authenticatable { protected $table = 'clients'; protected $fillable = ['name', 'email', 'password']; }
- 生成各自的登录控制器,指定使用对应Guard:
// App\Http\Controllers\Backpack\Admin\LoginController.php namespace App\Http\Controllers\Backpack\Admin; use Backpack\CRUD\app\Http\Controllers\Auth\LoginController as BackpackLoginController; class LoginController extends BackpackLoginController { protected $guard = 'admin'; }
同理创建ClientLoginController,设置protected $guard = 'client';
4. 注册面板专属路由
在routes/backpack/目录下创建admin.php和client.php,分别注册对应面板的路由:
比如routes/backpack/admin.php:
Route::group([ 'prefix' => config('backpack.base.route_prefix', 'admin'), 'middleware' => array_merge( (array) config('backpack.base.web_middleware', 'web'), (array) config('backpack.base.middleware_key', 'admin') ), 'namespace' => 'App\Http\Controllers\Backpack\Admin', ], function () { Route::get('login', 'LoginController@showLoginForm')->name('backpack.admin.login'); Route::post('login', 'LoginController@login'); Route::post('logout', 'LoginController@logout')->name('backpack.admin.logout'); // 管理员面板的CRUD路由示例 CRUD::resource('admin-user', 'AdminUserCrudController'); });
client.php路由文件同理替换为客户面板的配置与控制器。
5. 分离菜单与视图
- 复制
resources/views/vendor/backpack/base/menu.blade.php,分别创建admin和client目录下的菜单文件,修改菜单内容适配各自面板的功能。 - 若需自定义视图,可在面板配置的
view_namespace指定目录下创建对应文件,继承Backpack原生样式。
6. 权限系统适配(可选)
如果使用Backpack/PermissionManager,需修改Permission和Role模型支持多Guard:
// App\Models\Permission.php public function guardName() { return $this->guard_name; }
创建权限时指定guard_name为admin或client,确保权限仅对对应面板生效。
内容的提问来源于stack exchange,提问作者Igor Kosicky
相关产品推荐
相关产品推荐

