浅谈 RBAC(基于角色的权限管理)

什么是基于角色的权限管理?

  在我们写项目时,可能会遇到需要给不同的用户分配不同的权限的情况,什么是权限呢?权限其实就是一个url,不同的url代表不同的功能,限定用户能访问的url,就给了用户不同的权限,权限管理在很多项目中都有用到,所以我们可以将权限管理的逻辑写成一个组件,使它在不同的项目中只要经过一定的修改就能使用。

RBAC权限模型

  用户角色表和角色权限表都是ManyToMany,要实现效果至少需要4张表(一个人只能有一个角色的情况下),一般情况下,使用下面的模型。

在这里插入图片描述

建表

下面的资源表就是权限表

用户表、角色表、资源表、角色-资源表(ManyToMany)

# models.py

from django.db import models

class Roles(models.Model):
    """
    角色表
    """
    name = models.CharField(max_length=32, verbose_name='角色名')
    status = models.BooleanField(default=True, verbose_name='状态')

    class Meta:
        db_table = 'roles'

    def __str__(self):
        return self.name


class AdminUser(models.Model):
    """
    管理员用户表
    """

    username = models.CharField(max_length=32, verbose_name='用户名')
    password = models.CharField(max_length=128, verbose_name='密码')
    head = models.CharField(max_length=256, verbose_name='头像')
    status = models.BooleanField(default=True, verbose_name='状态')
    is_supper = models.BooleanField(default=False, verbose_name='是否超级用户')
    role = models.ForeignKey(Roles, on_delete=models.CASCADE, verbose_name='角色')

    class Meta:
        db_table = 'adminUser'

    def __str__(self):
        return self.username


class Resourse(models.Model):
    """
    资源表
    """
    name = models.CharField(max_length=32, verbose_name='用户名')
    status = models.BooleanField(default=True, verbose_name='状态')
    url = models.CharField(max_length=128, verbose_name='url')
    level = models.IntegerField(verbose_name='资源等级')
    pid = models.ForeignKey('self', on_delete=models.SET_NULL, null=True,blank=True, related_name='subs')
    roles = models.ManyToManyField(Roles, related_name='resources', blank=True)

    class Meta:
        db_table = 'resources'

    def __str__(self):
        return self.name

构造数据

在用户登录成功以后,根据用户的角色,分配相应的资源(url),这样的话就实现了权限管理。

class LoginView(APIView):
    """
    登录接口
    """
        def get(self, request):
        """
        登录成功的资源
        :param request:
        :return:
        """
        user_id = request.query_params.get('user_id')
        user_obj = AdminUser.objects.filter(pk=user_id).first()
        role_obj = Roles.objects.filter(id=user_obj.role_id).first()
        # 查询角色对应的资源
        res_obj = role_obj.resources.all()
        # 父类列表
        parent_list = []
        # 父类id列表
        parent_id_list = []
        for i in res_obj:
            parent_dict = {}
            parent_dict['id'] = i.pid.id
            parent_dict['name'] = i.pid.name
            parent_dict['pic'] = i.pid.pic
            parent_dict['subs'] = []
            if i.pid.id not in parent_id_list:
                parent_list.append(parent_dict)
                parent_id_list.append(i.pid.id)
        # 当父id等于父类列表的id,在父类列表下加子类
        parent = []
        returnlist = []
        for i in parent_list:
            parent = i
            for j in res_obj:
                if i['id'] == j.pid.id:
                    dict = {}
                    dict['id'] = j.id
                    dict['name'] = j.name
                    dict['url'] = j.url
                    parent['subs'].append(dict)
            returnlist.append(parent)
        return Response({'resources': returnlist})

效果展示

在这里插入图片描述

总结

RBAC的核心思想就是限定用户能访问的url,给用户不同的权限

在这里插入图片描述

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
我们开发业务系统的时候,基本上都会涉及到权限管理模块,要求不同的人看到不同的菜单,操作不同的按钮,看到不同的数据。很多初学者面对这样的需求不知道如何下手,特别是稍微复杂点的权限,更是找不到方向,为此我们夜鹰教程网特别推出了这套基于角色权限管理视频教程,通过给用户分配角色,给角色分配权限,来实现权限管理。这样一来,可以实现不同的人管理不同的菜单,操作不同的按钮,看到不同的数据。可以划分权限组,每个组的成员拥有相同的权限。也可以把同一个人分配到不同的权限组,具有多个权限组的权限,实现权限的组合。 本套教程通过c-s和b-s两种模式讲解,如果没有学过winform开发的学员可以通过本套教程补充下winform开发知识,以桌面程序的方式实现数据的CRUD操作,同时还可以学会一些常用控件的使用,特别是树形菜单的使用,以及递归的编程思想。 C-S部分目录 001 课程介绍 002 效果演示 003 新建项目 004 用户表 005 角色表 006 功能权限表 007 用户分配角色的表 008 角色拥有的菜单权限 009 登录界面设计 010 控件name 011 数据库操作类 012 登录操作 013 用户类 014 新建主窗体 015 主窗体布局 016 树形菜单 017 加载数据 018 递归调用 019 点击事件 020 密码修改 021 设备管理 022 角色列表 023 用户列表 024 新增用户 025 插入用户数据 026 显示用户数据 027 查询用户数据 028 用户数据分页 029 编辑用户数据 030 保存用户数据 031 删除用户数据 032 角色主数据 033 表单验证 034 编辑角色 035 角色数据分页 036 删除角色数据 037 设备列表 038 新增设备 039 设备分页 040 编辑设备 041 删除设备 042 点击菜单打开对应窗体 043 用户参数传递 044 通过构造函数传递参数 045 验证旧密码 046 通过菜单打开用户列表 047 菜单权限 048 权限主数据 049 给用户分配角色 050 显示待分配的菜单权限 051 角色用有菜单权限 052 取消菜单权限 053 保存菜单权限 054 清空旧的菜单权限 055 加载旧的菜单权限 056 功能权限配置 057 加载待分配的功能权限 058 加载已分配的功能权限 059 移动功能权限 060 保存功能权限 061 清空旧功能权限 062 分配数据权限 063 拼接已经分配的权限 064 移除权限 065 角色数据权限保存 066 给用户分配角色 067 待分配的角色 068 判断用户拥有的权限 069 获取功能权限 070 控制功能按钮是否可用 071 不能的用户看到不同的数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楼下安同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值