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中实现了权限控制。通过对权限、角色和用户之间的关系进行定义,我们可以在系统中轻松地实现细粒度的权限控制,从而保证系统的安全性和合规性。