Laravel——用户角色权限控制包 Laravel-permission

栏目: PHP · 发布时间: 5年前

内容简介:您可以通过 composer 安装软件包:在发布迁移

您可以通过 composer 安装软件包:

composer require spatie/laravel-permission
复制代码

config/app.php 文件中添加服务提供者:

'providers' => [
    // ...
    Spatie\Permission\PermissionServiceProvider::class,
];
复制代码

发布迁移

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
复制代码

迁移生成表

php artisan migrate
复制代码

roles 角色表

permissions 权限表

role_has_permissions 角色权限表

model_has_roles 用户角色表,用户通过角色获取权限使用

model_has-permissions 用户权限表,用户直接获取权限使用

发布配置文件

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
复制代码

配置

config/permission.php

如果自定义role和permission模型,需要分别继承 Spatie\Permission\Models\PermissionSpatie\Permission\Models\Role ,并修改配置文件models.role和models.permisssion

return [
    'models' => [
    
        /*
         * 当使用这个包中的 “HasRoles” 特性时,我们需要知道应该
         * 使用哪个 Eloquent 模型来获取您的权限。
         * 当然,它通常只是“权限(Permission)”模型,你也可以使用任何你喜欢的模型。
         * 
         * 您使用的权限模型必须实现
         *  `Spatie\Permission\Contracts\Permission` 契约。
         */
    
        'permission' => \App\Models\Permission::class,
    
        /*
         * 当使用这个包中的 “HasRoles” 特性时,
         * 我们需要知道应该使用哪个 Eloquent 模型来检索你的角色。
         * 当然,它通常只是 “角色(Role)” 模型,你也可以使用任何你喜欢的模型。
         *
         * 您使用的权限模型必须实现
         * `Spatie\Permission\Contracts\Role` 契约。
         */
    
        'role' => \App\Models\Role::class,
    
    ],
    
    ....
]
复制代码

Models/role.php

use Spatie\Permission\Models\Role as SpatieRole;

class Role extends SpatieRole
{
}
复制代码

Models/permission.php

use Spatie\Permission\Models\Permission as SpatiePermission;

class Permission extends SpatiePermission
{
}
复制代码

将 Spatie\Permission\Traits\HasRoles 特征添加到您的 User 模型中:

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
复制代码

权限验证

Middleware/VerifyPermissions.php

创建中间件

public function handle($request, Closure $next)
{
    $route = $request->decodedPath();
    $user = $request->user();

    if (!$user->hasPermissionTo($route)) {
        return response()->json([
            'code' => 1001,
            'message' => "No authority",
        ], 401);
    };

    return $next($request);
}
复制代码

注册路由中间件

protected $routeMiddleware = [
        ...
        'role' => \App\Http\Middleware\VerifyPermissions::class
    ];
复制代码

路由使用中间件

Route::middleware('role')->group(function () {

});
复制代码

参考代码

添加角色权限

public function addRoleAndPermissions($data)
{
    $role = Role::create(['name' => $data['name']]);

    $permissionNames = $this->permissionModel->getPermissionColumn('name');
    foreach ($data['permissions'] as $permission) {
        if (in_array($permission, $permissionNames)) {
            $role->givePermissionTo($permission);
        } else {
            $permission = Permission::create(['name' => $permission]);
            $role->givePermissionTo($permission);
        }
    }
}
复制代码

添加多个角色权限

public function updateRolesAndPermissions($datas)
{
    foreach ($datas as $roleId => $permissions) {
        $this->addNotExistPermission($permissions);

        $role = Role::findById($roleId);

        $rolePermissionNames = array_column($role->permissions()->get()->toArray(), 'name');

        $addRolePermissions = array_diff($permissions, $rolePermissionNames);
        $delRolePermissions = array_diff($rolePermissionNames, $permissions);

        $role->givePermissionTo($addRolePermissions);
        $role->revokePermissionTo($delRolePermissions);
    }
}

public function addNotExistPermission($permissions)
{
    $permissionNames = $this->permissionModel->getPermissionColumn('name');
    $addPermissions = array_diff($permissions, $permissionNames);

    foreach ($addPermissions as $permission) {
        Permission::create(['name' => $permission]);
    }
}
复制代码

用户添加角色

$user = $this->userModel::where('name', $userData['name'])->first();
$user->assignRole($roleId);
复制代码

获取用户的角色

$role = $user->getRoleNames();
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

新媒体革命——在线时代的媒体、公关与传播

新媒体革命——在线时代的媒体、公关与传播

仇勇 / 电子工业出版社 / 2016-2-1 / CNY 50.00

这既是传统媒体的大裂变年代,也是在线媒体开启的新闻业的黄金时代。 信息流动的新法则不仅改变了媒体业,也在重塑公关、传播和商业的面貌。总之,这个世界的连接方式不仅不再相同,而且这一改变不可逆转。在这个全新重启的在线时代里,无论是信息的获取还是商业本身,信任都变得比以往更重要。 从告别传统媒体的那一刻起,我就有着两个小小的“野心”:一是探寻适合在线时代的媒体生产方式;二是让优质内容有权获得......一起来看看 《新媒体革命——在线时代的媒体、公关与传播》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具