一.什么是权限
能做哪些事情,不能做哪些事情,可以做的权限
二.设计权限
思路:
web应用中,所谓的权限,其实就是一个用户能够访问的url,通过对用户访问的url进行控制,从而实现对用户权限的控制.
每个用户代表不同的的角色,每个角色具有不同的权限.
一个用户可以有多重角色,多个人也可以是一种角色(比如说一个公司可以有多个销售),所以说,用户与角色之间的关系是多对多的关系.
一个角色能够拥有多个权限,一个权限也可以分配给多个角色;所以说角色和权限的关系也是多对多的关系.
三.权限实现
建立表关系
具体代码如下:
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 }]