您的位置 首页 php

PHP Laravel框架用户权限管理,按钮级别控制(详细)

环境配置:

系统:Linux

语言:PHP

框架:Laravel 5.8

主要技术:Zizaco/Entrust扩展包,MySQL,PHP,Composer

扩展包名称:

 Zizaco/Entrust  

安装配置:

 // 1. 在项目根目录运行
composer require zizaco/entrust

// 2. 在config/app.php文件 [providers]数组中添加一项:
Zizaco\Entrust\EntrustServiceProvider::class,
  
// 3.  在config/app.php文件 [aliases]数组中添加一项:
'Entrust'   => Zizaco\Entrust\EntrustFacade::class,
  
// 4. 生成迁移文件(这一步之前必须配置好数据库连接)
 php artisan entrust:migration
 
// 5. 运行迁移文件
 php artisan migrate
 
// 可能报错如下:
 Illuminate\Database\QueryException  : SQLSTATE[42000]: 
 Syntax error or access violation: 1071 Specified key was too long; 
max key length is 1000 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
// 解决方式:在 app/Providers/AppServiceProvider.php文件 【boot】方法中 添加:
Schema::defaultStringLength(191);

// 6. 这时数据库中会创建4个表
      1. permissions -----------权限表
      2. permission_role ------ 权限角色关系表
      3. roles ------------------ 角色表
      4. role_user ------------- 角色用户关系表

// 7. 在用户表模型中添加:
 // ...省略多余代码
 use Zizaco\Entrust\Traits\EntrustUserTrait;
  class User extends Authenticatable
  {
    use EntrustUserTrait;
    use Notifiable;
    // ...省略多余代码
  }
// 8. 创建表模型,在项目根目录运行
 php artisan make:model Model/Role
 php artisan make:model Model/Permission
至此;配置部分完毕!  

创建数据、模拟用户登陆

  1. 创建角色 (创建两个角色,后期测试会用到)
 public function createRoles()
 {
         // 创建第一个角色
        $roleModel               = new Role();
        $roleModel->name         = 'admin'; //角色名称
        $roleModel->display_name = '管理员'; //角色可读名称
        $roleModel->save();

        // 创建第二个角色
        $roleModel               = new Role();
        $roleModel->name         = 'ordinary'; //角色名称
        $roleModel->display_name = '普通用户'; //角色可读名称
        $roleModel->save();
    }
//roles表->得到 admin ID 为1,ordinary ID为2
  

Table roles 数据

  1. 创建权限(可细分的权限)
 		// 创建权限
    public function createPermissions()
    {
        // 创建第一个权限
        $permissionModel               = new Permission();
        $permissionModel->name         = 'btn_display'; //权限名称
        $permissionModel->display_name = '按钮可见'; //权限可读名称
        $permissionModel->save();

        // 创建第二个权限
        $permissionModel               = new Permission();
        $permissionModel->name         = 'menu_display'; //权限名称
        $permissionModel->display_name = '菜单可见'; //权限可读名称
        $permissionModel->save();
    }
// permissions表->得到 btn_display ID为1 menu_display ID为2  

Table permissions 数据

  1. 为角色分配权限
 public function setRolesPerm()
    {
        // 1. 设置 admin 角色权限
        // 获取角色ID
        $user_id     = Role::where('name', 'admin')->first(['id']);
        // 获取所有权限,让admin拥有所有权限
        $permissions = Permission::get(['id']);
        // 向 permission_role 表中写入数据
        foreach ($permissions as $per) {
            DB::table('permission_role')->insert([
              'permission_id' => $per->id,
              'role_id'       => $user_id->id,
            ]);
        }

        // 1. 设置 ordinary 角色权限
        // 获取角色ID
        $user_id     = Role::where('name', 'ordinary')->first(['id']);
        // 获取所有权限,让ordinary只拥有按钮可见权限
        $permissions = Permission::where('name', 'btn_display')->first(['id']);
        // 向 permission_role 表中写入数据
        DB::table('permission_role')->insert([
          'permission_id' => $per->id,
          'role_id'       => $user_id->id,
        ]);
    }  

Table permission_role 数据

  1. 创建用户
 public function createUser()
    {
        $userModel           = new User();
        $userModel->name     = 'admin';
        $userModel->email    = '1234567@qq.com';
        $userModel->password = '123456'; //未做加密处理,生产环境请做加密
        $userModel->save();
        $userModel           = new User();
        $userModel->name     = 'test';
        $userModel->email    = '123456789@qq.com';
        $userModel->password = '123456'; //未做加密处理,生产环境请做加密
        $userModel->save();
    }  

Table users 数据

  1. 为用户分配角色组
  public function setUserRole()
    {
        // 1. 赋予 admin 用户 admin 角色
        $user_info = User::where('name', 'admin')->first();
        $role_info = Role::where('name', 'admin')->first();
        $user_info->attachRole($role_info);

        // 1. 赋予 test 用户 ordinary 角色
        $user_info = User::where('name', 'test')->first();
        $role_info = Role::where('name', 'ordinary')->first();
        $user_info->attachRole($role_info);
    }  

如遇报错: Class ‘App\Role’ not found

这是 命名空间 的问题,两种解决办法:

1.把Role.php、Permission.php和用户表模型User.php 命名空间改为 App\

2.根据路径 /vendor/zizaco/entrust/src/config.php

将return的数组键为’role’的值改为项目中Role.php实际命名空间

键’user’、’permission’同理 ,便可解决

Table role_user 数据

  1. 登陆
  public function Login()
    {
        // 此处应接受前端数据进行验证
        // 这边不再赘述 直接模拟登陆
        // 用户 admin 登陆
        $user_info = User::where('name', 'admin')->first();

        // 用户 test 登陆
        // $user_info = User::where('name', 'test')->first();
        
        // 将用户信息存入Session
        session(['user_info' => $user_info]);
        return view('index');
    }  

至此,测试所需数据全部创建完毕

权限的使用

  1. 根据上面设置的角色组的权限建立测试HTML(index.blade.php)
 <!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>权限测试</title>
</head>

@if(session('user_info')->can('menu_display'))
<h1>菜单</h1>
@endif
@if(session('user_info')->can('btn_display'))
<button>按钮</button>
@endif

<body>
</body>
</html>  
  1. 用户 admin 拥有所有权限,登陆之后,应当显示【菜单】以及【按钮】,如下图:

用户 admin 登陆页面显示情况

  1. 用户 test 只拥有 【菜单可见】权限,应当只显示菜单,如下图:

用户 test 登陆页面显示情况

  1. 后端对于角色的判断,不同角色执行不同代码
 public function judgeRoles()
    {
        // 拥有 admin 角色的用户执行
        if (session('user_info')->hasRole('admin')) {
            // 业务代码
            return 'admin角色业务代码执行完毕';
        }

        // 拥有 ordinary 角色的用户执行
        if (session('user_info')->hasRole('ordinary')) {
            // 业务代码
            return 'ordinary角色业务代码执行完毕';
      }  

至此;关于PHP权限设置就完成了

以上都为测试学习代码,实际生产环境中还需要根据业务需求对代码进行修改整合,但是基础的权限设计功能已经实现。

谢谢!

最后的话:

如果各位大佬有什么更好的方法,请评论或私信我,我会及时回复的,欢迎各位大佬一起来探讨技术。

如果各位感觉我的文章对您有帮助的话,请您不要吝啬您的点赞!

祝大家技术一节更比一节高!

文章来源:智云一二三科技

文章标题:PHP Laravel框架用户权限管理,按钮级别控制(详细)

文章地址:https://www.zhihuclub.com/150792.shtml

关于作者: 智云科技

热门文章

网站地图