一、功能分析: 一个成熟的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数据模型
表结构
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
四 , 权限初始化设置,中间键获取,判断,生成权限菜单:
当用户登录之后获取到用户名,密码查询用户表查询得到角色,权限信息,写入到当前用户的session 中
用session来保存用户的权限信息;
写入session之后每次请求到这里 ,可以通过django的中间键来判断用户的权限;
1,用户首次登陆,初始时该用户权限,写入session;
View Code from app02 import models from app02.service import init_session from django.conf import settings import re def login(reqeust): if reqeust.method == 'GET': return render(reqeust, 'login.html') else: user = reqeust.POST.get('user') pwd = reqeust.POST.get('pwd') user_obj = models.UserInfo.objects.filter(name=user, pwd=pwd).first() if user: # init_session(reqeust,user_obj) init_session.per(reqeust,user_obj)#用户首次登录初始化用户权限信息 return redirect('/index/') else: return render(reqeust, 'login.html') def index(request): return HttpResponse('INDEX') def test_query(request): return render(request,'test.html')