前言
RBAC:Role-Based Access Contral 基于角色的访问控制。
一、功能分析:
一个成熟的web应用,对权限的控制、管理是不可少的;对于一个web应用来说是什么权限?
这要从web应用的使用说起,用户在浏览器输入一个url,访问server端,server端返回这个url下对应的资源;
所以 对于用户来说 1个可以访问url 就等于1个权限
比如某人开发了一个web应用包含以下5个url,分别对于不同资源;
1、91.91p15.space/Chinese/
2、91.91p15.space/Japanese and Korean/
3、91p15.space/Euramerican/
4、91p15.space/Latin America/
5、91p15.space/African/
--------------------------------------------------------------------------------------------------------
普通用户:可以访问 5
白金用户:可以访问 4、5、1
黄金用户:可以访问1、2、3、4、5
为什么某些网站会为广大用户做角色划分呢(比如 普通、会员、黑金、白金)?
因为给用户归类后,便于权限的划分、控制、管理;
所以我们把这种基于角色来做得权限控制,称为RBAC(Role Basic Access Control)
二、权限管理数据库表结构设计
1、用户表:用户表和角色表为多对多关系,1个用户可以有多个角色,1个角色可以被多个用户划分;
2、角色表:角色表和权限也是多对多关系,一个角色可以有多个权限,一个权限可以划分给多个角色
3、菜单表:用于在前端引导用户找到自己的权限,并可以设置多级菜单对用户权限进行划分;所以权限表和菜单表是1对多关系;
由于需要构建多级菜单,并且拥有嵌套关系,所以菜单表自引用;
启发:一般设计包含层级结构嵌套,切嵌套的层级无法预测的表结构使用自关联;(表1外键-----》表2----》外键表3是行不通的,因为无法预测嵌套层级的深度)
例如:多级评论(无法预测,评论树的深度)
三、modal.py数据模型
1、创建一个独立的app作为公共模块,以备后期遇到权限相关项目时使用;
from django.db import models from django.db import models class Menu(models.Model): ''' 菜单表''' caption=models.CharField(max_length=32) parent=models.ForeignKey('Menu',null=True,blank=True) #自关联 def __str__(self): caption_list = [self.caption,] p=self.parent while p: #如果有父级菜单,一直向上寻找 caption_list.insert(0,p.caption) p=p.parent return "-".join(caption_list) class Permission(models.Model): '''权限表''' title = models.CharField(max_length=64) url = models.CharField(max_length=255) menu = models.ForeignKey('Menu', null=True, blank=True)#和菜单是1对多关系 def __str__(self): return '权限名称: %s--------权限所在菜单 %s'% (self.title,self.menu) class Role(models.Model): '''角色表''' rolename=models.CharField(max_length=32) permission=models.ManyToManyField('Permission') def __str__(self): return '角色: %s--------权限 %s'% (self.rolename,self.permission) class UserInfo(models.Model): '''用户表''' name=models.CharField(max_length=32) pwd=models.CharField(max_length=64) rule=models.ManyToManyField('Role') def __str__(self): return self.name