Laravel Admin是一款基于Laravel框架开发的后台管理系统。它提供了许多现成的功能模块和UI组件,可以快速帮助开发者搭建出一个功能齐全、美观大方的后台管理系统。但是,在实际的项目中,往往需要对不同的用户进行权限控制,以保证系统的安全性和合规性。下面,我们就来介绍一下如何在Laravel Admin中实现权限控制。
步骤一:安装扩展包
在Laravel Admin中实现权限控制,我们需要安装一个名为laravel-admin-permission的扩展包。这个扩展包可以帮助我们快速地实现权限控制。
composer require Encore/laravel-admin-permission
步骤二:创建权限表
在Laravel Admin中,我们需要创建一个权限表,来存储系统中的所有权限。我们可以通过运行以下命令来生成权限表的迁移文件:
php artisan make:migration create_permissions_table --create=permissions
然后,我们需要在迁移文件中定义权限表的结构:
use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;
class CreatePermissionsTable extends Migration
{
public function up()
{
Schema::create('permissions', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->string('slug')->unique();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('permissions');
}
}
在上面的迁移文件中,我们定义了权限表的三个字段:id、name和slug。其中,name字段表示权限名称,slug字段表示权限别名。我们需要保证slug字段的唯一性,以便于后续的权限检查。
步骤三:创建角色表
在Laravel Admin中,我们还需要创建一个角色表,来存储系统中的所有角色。我们可以通过运行以下命令来生成角色表的迁移文件:
php artisan make:migration create_roles_table --create=roles
然后,我们需要在迁移文件中定义角色表的结构:
use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;
class CreateRolesTable extends Migration
{
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->string('slug')->unique();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('roles');
}
}
在上面的迁移文件中,我们定义了角色表的三个字段:id、name和slug。其中,name字段表示角色名称,slug字段表示角色别名。我们需要保证slug字段的唯一性,以便于后续的权限检查。
步骤四:创建权限-角色关联表
在Laravel Admin中,我们还需要创建一个权限-角色关联表,来存储系统中的所有权限与角色之间的关联关系。我们可以通过运行以下命令来生成权限-角色关联表的迁移文件:
php artisan make:migration create_permission_role_table --create=permission_role
然后,我们需要在迁移文件中定义权限-角色关联表的结构:
use Illuminate\\\\Database\\\\Migrations\\\\Migration;
use Illuminate\\\\Database\\\\Schema\\\\Blueprint;
use Illuminate\\\\Support\\\\Facades\\\\Schema;
class CreatePermissionRoleTable extends Migration
{
public function up()
{
Schema::create('permission_role', function (Blueprint $table) {
$table->integer('permission_id')->unsigned();
$table->integer('role_id')->unsigned();
$table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->primary(['permission_id', 'role_id']);
});
}
public function down()
{
Schema::dropIfExists('permission_role');
}
}
在上面的迁移文件中,我们定义了权限-角色关联表的两个字段:permission_id和role_id。我们还定义了permission_id和role_id两个字段的外键关系,并设置级联删除。我们需要保证(permission_id, role_id)这个组合字段的唯一性,以便于后续的权限检查。
步骤五:定义模型关系
在Laravel Admin中,我们还需要定义模型之间的关系。具体来说,我们需要在Permission模型、Role模型和User模型中分别定义它们之间的关系。
首先,我们需要在Permission模型中定义与Role模型之间的多对多关系:
namespace App;
use Illuminate\\\\Database\\\\Eloquent\\\\Model;
class Permission extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
然后,我们需要在Role模型中定义与Permission模型之间的多对多关系:
namespace App;
use Illuminate\\\\Database\\\\Eloquent\\\\Model;
class Role extends Model
{
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
}
最后,我们需要在User模型中定义与Role模型之间的多对多关系:
namespace App;
use Illuminate\\\\Foundation\\\\Auth\\\\User as Authenticatable;
class User extends Authenticatable
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function hasRole($role)
{
if (is_string($role)) {
return $this->roles->contains('name', $role);
}
return !! $role->intersect($this->roles)->count();
}
public function hasPermission($permission)
{
return $this->hasRole($permission->roles);
}
}
在上面的代码中,我们定义了User模型中的三个方法:roles()、hasRole()和hasPermission()。其中,roles()方法表示User模型与Role模型之间的多对多关系;hasRole()方法表示判断用户是否具有某个角色;hasPermission()方法表示判断用户是否具有某个权限。
步骤六:创建权限控制中间件
在Laravel Admin中,我们需要创建一个权限控制中间件,来实现对系统中的所有请求进行权限检查。我们可以通过运行以下命令来生成中间件:
php artisan make:middleware CheckPermission
然后,我们需要在中间件中实现权限检查的逻辑:
namespace App\\\\Http\\\\Middleware;
use Closure;
use Illuminate\\\\Support\\\\Facades\\\\Auth;
class CheckPermission
{
public function handle($request, Closure $next, $permission)
{
if (Auth::guest()) {
return redirect()->guest('login');
}
if (! $request->user()->hasPermissionTo($permission)) {
abort(403, '无权访问');
}
return $next($request);
}
}
在上面的代码中,我们定义了CheckPermission中间件,并实现了handle()方法。在handle()方法中,我们首先判断用户是否登录,如果未登录则重定向到登录页面。如果已登录,则判断用户是否具有指定的权限,如果不具有则抛出403异常。如果具有指定的权限,则继续执行后续的请求处理逻辑。
步骤七:应用权限控制中间件
最后,在Laravel Admin中应用我们刚刚创建的权限控制中间件。具体来说,我们可以在routes/web.php文件中定义我们的路由,并应用CheckPermission中间件。例如:
Route::group(['middleware' => ['check-permission:edit articles']], function () {
Route::get('/admin/articles/{id}/edit', 'ArticleController@edit')->name('admin.articles.edit');
Route::put('/admin/articles/{id}', 'ArticleController@update')->name('admin.articles.update');
});
在上面的代码中,我们定义了一个路由组,其中包含了两个路由:/admin/articles/{id}/edit和/admin/articles/{id}。这两个路由都应用了CheckPermission中间件,并指定了edit articles这个权限。这意味着,只有具有edit articles这个权限的用户才能够访问这两个路由。
到此为止,我们已经成功地在Laravel Admin中实现了权限控制。通过对权限、角色和用户之间的关系进行定义,我们可以在系统中轻松地实现细粒度的权限控制,从而保证系统的安全性和合规性。