Laravel-permission(权限管理的扩展包)

什么是多用户角色


举个例子,例如我们平常使用的论坛

站长 ------ 拥有最高权限,最主要的是能够对用户进行管理的权限

管理员 ----- 对一些文章的管理,不会造成对网站有较大的影响

vip ----- 对一些资源有下载权限

普通用户 ---- 只能够进行简单的对自己文章的增删改、评论等

游客 ---- 只能进行基本的浏览

建表


 

  • roles ------- 角色信息:站长等
  • permissions ------- 权限信息:管理内容等
  • model_has_roles ------- 模型对应角色 = 用户对应的角色
  • role_has_permissions ------- 角色对应权限 = 角色有什么权限
  • model_has_permissions ------- 模型对应权限 = 用户有权限

 

我们来梳理一下关联关系

权限(permissions)与 角色(roles) ,一个 权限 可能被多个 角色 拥有,一个 角色 可能有多个 权限,关联关系:多对多(role_has_permissions)

用户权限 一对多(model_has_permissions)

用户 角色 一对多(model_has_roles)

由次来说,关系明确了,当用户有什么角色 或者 有什么权限,即执行相应的操作

1. 安装扩展包

composer require "spatie/laravel-permission:~2.7"

生成数据库迁移文件:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

在 migration 目录下可看到相关表信息,执行数据库迁移

php artisan migrate

生成配置信息:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

在 User 模型下加载

.....
use Spatie\Permission\Traits\HasRoles;  // use

class User extends Authenticatable
{

    use HasRoles;  // 加载角色相关信息
    .....

创建角色 和用户

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

.....
$role = Role::create(['name' => 'writer']);  // 创建角色
$permission = Permission::create(['name' => 'edit articles']);// 创建权限

使用


为用户添加权限

$user->givePermissionTo('edit articles');

为用户添加角色

$user->assignRole('writer');

$user->assignRole(['writer', 'admin']);

给用户删除权限

$user->revokePermissionTo('edit articles');

给角色添加权限

$role->givePermissionTo('edit articles');

为角色添加权限

$role->givePermissionTo('edit articles');

撤销一个权限 并且 添加一个新权限

$user->syncPermissions(['edit articles', 'delete articles']);

获得当前用户的角色集合

$user->getRoleNames();

将多个角色同步到权限

$role->syncPermissions($permissions); //  @param array $permissions

$permission->syncRoles($roles);

从角色中删除权限

$role->revokePermissionTo($permission);
$permission->removeRole($role);

获取当前的用户的权限列表

$permissions = $user->permissions;

获取用户的所有权限,或者直接权限 (odel_has_permissions),或者从角色获取,或者从两者获取

$permissions = $user->getDirectPermissions();
$permissions = $user->getPermissionsViaRoles();
$permissions = $user->getAllPermissions();

获取用户的角色集合 collection

$roles = $user->getRoleNames(); // Returns a collection

返回指定角色的用户 | Returns only users with the role 'writer'

$users = User::role('writer')->get(); // 

返回指定权限的用户

$users = User::permission('edit articles')->get();

用户有什么角色

$user->hasRole('writer');

验证类


检查是否有某个权限

$user->hasPermissionTo('edit articles');

$user->can('edit articles');

检查是否有某个角色 | 或者列

$user->hasRole('writer');

$user->hasAnyRole(Role::all());

$user->hasAllRoles(Role::all());

传递 id 值进行判断是否有某个权限

$user->hasPermissionTo('1');
$user->hasPermissionTo(Permission::find(1)->id);
$user->hasPermissionTo($somePermission->id);    

是否拥有一组权限

$user->hasAnyPermission(['edit articles', 'publish articles', 'unpublish articles']);

检查一个角色是否有某些权限 | 删除某些权限

$role->hasPermissionTo('edit articles'); 

$role->revokePermissionTo('edit articles'); // 删除

模板使用


@role('writer')
    I am a writer!
@else
    I am not a writer...
@endrole

------------------------

@hasrole('writer')
    I am a writer!
@else
    I am not a writer...
@endhasrole

------------------------

@can('edit articles') // 拥有某个权限 可执行操作
//
@endcan

数据填充

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class RolesAndPermissionsSeeder extends Seeder
{
    public function run()
    {
        // Reset cached roles and permissions
        app()['cache']->forget('spatie.permission.cache');

        // create permissions
        Permission::create(['name' => 'edit articles']);
        Permission::create(['name' => 'delete articles']);
        Permission::create(['name' => 'publish articles']);
        Permission::create(['name' => 'unpublish articles']);

        // create roles and assign created permissions

        $role = Role::create(['name' => 'writer']);
        $role->givePermissionTo('edit articles');

        $role = Role::create(['name' => 'moderator']);
        $role->givePermissionTo(['publish articles', 'unpublish articles']);

        $role = Role::create(['name' => 'super-admin']);
        $role->givePermissionTo(Permission::all());
    }
}

提示:如果在数据库权限相关信息表的修改,必须掉用清除 缓存的方法

// 命令删除
php artisan cache:forget spatie.permission.cache  

app()['cache']->forget('spatie.permission.cache'); 

部分来自于教程第二部分,Laravel-permission github 地址 GitHub - spatie/laravel-permission: Associate users with roles and permissions

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Laravel-permission是一个基于角色的权限控制解决方案,它允许你轻松地将权限分配给用户,并通过角色来管理这些权限。以下是一些常见的用法: 1.安装laravel-permission ```shell composer require spatie/laravel-permission ``` 2.在config/app.php文件中添加服务提供者和门面别名 ```php 'providers' => [ // ... Spatie\Permission\PermissionServiceProvider::class, ], 'aliases' => [ // ... 'Permission' => Spatie\Permission\Models\Permission::class, 'Role' => Spatie\Permission\Models\Role::class, ], ``` 3.运行迁移 ```shell php artisan migrate ``` 4.在User模型中使用HasRoles trait ```php use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasRoles; // ... } ``` 5.创建角色和权限 ```php use Spatie\Permission\Models\Role; use Spatie\Permission\Models\Permission; // 创建角色 $role = Role::create(['name' => 'writer']); // 创建权限 $permission = Permission::create(['name' => 'edit articles']); ``` 6.将权限分配给角色 ```php $role->givePermissionTo($permission); ``` 7.将角色分配给用户 ```php $user->assignRole('writer'); ``` 8.检查用户是否有某个权限 ```php $user->hasPermissionTo('edit articles'); ``` 9.获取用户的所有权限 ```php $permissions = $user->permissions; ``` 10.获取用户的直接权限、角色权限或所有权限 ```php $directPermissions = $user->getDirectPermissions(); $rolePermissions = $user->getPermissionsViaRoles(); $allPermissions = $user->getAllPermissions(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_34701838

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值