一.什么是权限

 能做哪些事情,不能做哪些事情,可以做的权限

二.设计权限

思路:

web应用中,所谓的权限,其实就是一个用户能够访问的url,通过对用户访问的url进行控制,从而实现对用户权限的控制.

每个用户代表不同的的角色,每个角色具有不同的权限.

一个用户可以有多重角色,多个人也可以是一种角色(比如说一个公司可以有多个销售),所以说,用户与角色之间的关系是多对多的关系.

一个角色能够拥有多个权限,一个权限也可以分配给多个角色;所以说角色和权限的关系也是多对多的关系.

django 菜单权限

 

 

 

三.权限实现

建立表关系

具体代码如下:

from django.db import models


class Menu(models.Model):
    title = models.CharField(max_length=32)
    icon = models.CharField(max_length=32)
    weight = models.IntegerField(default=1, verbose_name='权重')
class Permission(models.Model):
    """
    权限表
    """
    title = models.CharField(max_length=32, verbose_name='标题')
    url = models.CharField(max_length=32, verbose_name='权限')
    
    menu = models.ForeignKey(to='Menu',on_delete=models.CASCADE,default=0,blank=True,null=True)
    pid = models.ForeignKey('self',on_delete=models.CASCADE,null=True,verbose_name='父权限')

    name = models.CharField(max_length=32, null=True, blank=True, unique=True)
    
    class Meta:
        verbose_name_plural = '权限表'
        verbose_name = '权限表'
    
    def __str__(self):
        return self.title


class Role(models.Model):
    name = models.CharField(max_length=32, verbose_name='角色名称')
    permissions = models.ManyToManyField(to='Permission', verbose_name='角色所拥有的权限', blank=True)
    
    def __str__(self):
        return self.name


class User(models.Model):
    """
    用户表
    """
    name = models.CharField(max_length=32, verbose_name='用户名')
    password = models.CharField(max_length=32, verbose_name='密码')
    roles = models.ManyToManyField(to='Role', verbose_name='用户所拥有的角色', blank=True)

    def __str__(self):
        return self.name

 

获取权限信息

每次当用户一登录是,就应该获取当前的用户所拥有的所有权限信息.

当然了首先需要构建的应该是当前用户的权限列表中.构建出来之后将其存入到session中,以便于之后的权限校验

这里还需要构造出我们创建菜单想要的数据结构,以便于之后创建二级菜单.

然后我们构建出来的菜单数据结构和权限列表如下所示:

permission_list[{
    'url': '/customer/',
    'pid': None,
    'title': '全部客户',
    'id': 1
}, {
    'url': '/customers/list/',
    'pid': None,
    'title': '共有客户',
    'id': 2
}, {
    'url': '/mycustomers/',
    'pid': None,
    'title': '我的客户',
    'id': 3
}, {
    'url': '/consult_records/',
    'pid': None,
    'title': '客户跟进记录',
    'id': 4
}, {
    'url': '/customer/count/',
    'pid': None,
    'title': '客户成单统计',
    'id': 5
}, {
    'url': '/enrollment/',
    'pid': None,
    'title': '报名情况',
    'id': 6
}, {
    'url': '/enrollment/add/',
    'pid': 6,
    'title': '添加报名记录',
    'id': 7
}, {
    'url': '/enrollment/edit/(\\d+)',
    'pid': 6,
    'title': '修改报名记录',
    'id': 8
}, {
    'url': '/ClassStudyRecord/list/',
    'pid': None,
    'title': '班级学习记录',
    'id': 9
}, {
    'url': '/ClassStudyRecord/add/',
    'pid': 9,
    'title': '添加学习记录',
    'id': 10
}, {
    'url': '/studentstudyrecord/edit/(\\d+)/',
    'pid': 9,
    'title': '添加记录',
    'id': 11
}, {
    'url': '/rbac/role/list/',
    'pid': None,
    'title': '角色管理',
    'id': 12
}, {
    'url': '/rbac/role/add/',
    'pid': 12,
    'title': '添加角色',
    'id': 13
}, {
    'url': '/rbac/role/edit/(\\d+)',
    'pid': 12,
    'title': '修改角色',
    'id': 14
}, {
    'url': '/rbac/role/del/(\\d+)',
    'pid': 12,
    'title': '删除角色',
    'id': 15
}, {
    'url': '/rbac/menu/list/',
    'pid': None,
    'title': '菜单管理',
    'id': 16
}, {
    'url': '/rbac/menu/add/',
    'pid': 16,
    'title': '添加目录',
    'id': 17
}, {
    'url': '/rbac/menu/edit/(\\d+)',
    'pid': 16,
    'title': '修改目录',
    'id': 18
}, {
    'url': '/rbac/permission/distrbute/',
    'pid': None,
    'title': '分配权限',
    'id': 19
}, {
    'url': '/rbac/permission/tree/',
    'pid': 19,
    'title': '权限树',
    'id': 20
}, {
    'url': '/index/',
    'pid': None,
    'title': '首页',
    'id': 21
}, {
    'url': '/logout/',
    'pid': None,
    'title': '注销',
    'id': 22
}, {
    'url': '/customers/add/',
    'pid': 1,
    'title': '添加客户',
    'id': 23
}, {
    'url': '/customers/add/',
    'pid': 2,
    'title': '添加客户',
    'id': 24
}, {
    'url': '/customers/add/',
    'pid': 3,
    'title': '添加客户',
    'id': 25
}, {
    'url': '/customer/del/(\\d+)/',
    'pid': 1,
    'title': '删除客户',
    'id': 26
}, {
    'url': '/customer/del/(\\d+)/',
    'pid': 2,
    'title': '删除客户',
    'id': 27
}, {
    'url': '/customer/del/(\\d+)/',
    'pid': 3,
    'title': '删除客户',
    'id': 28
}, {
    'url': '/customers/edit/(\\d+)',
    'pid': 1,
    'title': '修改客户',
    'id': 29
}, {
    'url': '/customers/edit/(\\d+)',
    'pid': 2,
    'title': '修改客户',
    'id': 30
}, {
    'url': '/customers/edit/(\\d+)',
    'pid': 3,
    'title': '修改客户',
    'id': 31
}, {
    'url': '/consult_records/add/',
    'pid': 4,
    'title': '添加客户跟进记录',
    'id': 32
}, {
    'url': '/consult_records/(\\d+)',
    'pid': 4,
    'title': '修改客户跟进记录',
    'id': 33
}, {
    'url': '/del_consult/(\\d+)',
    'pid': 4,
    'title': '删除客户跟进记录',
    'id': 34
}]
权限列表

相关文章: