Django 之 权限管理的插件

  

一、功能分析:
一个成熟的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')
View Code

猜你喜欢

转载自www.cnblogs.com/zzy7372/p/9965565.html
今日推荐