Django web框架之权限管理一

Posted Pythia丶陌乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django web框架之权限管理一相关的知识,希望对你有一定的参考价值。

1. 需求分析:

准备:创建独立app,
rbac    #权限管理模块/组件
app01    #应用

分配权限,URL

2. 数据库设计

2.1 设计思路

第一版:

	权限表:
		ID          url                        title                     is_menu
		 1         /index/                     首页                        False               
		 2         /userinfo/                  用户列表                    True
		 3         /userinfo/add/              添加用户                    True
		 4         /userinfo/del/(\d+)/        删除用户                    False
		 5         /userinfo/edit/(\d+)/       修改用户                    False
		 
		 
	用户表:
		ID          username        password    ....
		 1           番禺             123
		 2           夹缝             123
		 3           果冻             123
		 4           鲁宁             123
	 
	权限用户关系表:
			用户ID         权限ID 
			   1             1
			   1             2
			   1             3
			   1             4
			   1             5
			   2             1
			   2             2
			   2             3
			   3             1
			   4             1
			   4             2
			   4             3

  

  

第二版:
		 
	用户表:
		ID          username        password    ....
		 1           番禺             123
		 2           夹缝             123
		 3           果冻             123
		 4           鲁宁             123
		 
		 
	角色表:
		ID          title 
		 1            CEO
		 2            CTO
		 4            COO
		 5            部门经理
		 6            技术员
		 
	用户和角色关系表:
		用户ID       角色ID
		  1            1
		  1            2
		  1            4
		  2            5
		  3            6
		  4            6

	权限表:
		ID          url                        title
		 1         /index/                     首页
		 2         /userinfo/                  用户列表
		 3         /userinfo/add/              添加用户
		 4         /userinfo/del/(\d+)/        删除用户
		 5         /userinfo/edit/(\d+)/        修改用户

	
	角色权限关系表:
		角色ID           权限ID 
		  1                1

 2.2 创建表类app01.models.py

from django.db import models

class UserInfo(models.Model):
    username=models.CharField(max_length=32,verbose_name=‘用户名‘)
    password=models.CharField(max_length=32,verbose_name=‘密码‘)
    email=models.CharField(max_length=32,verbose_name=‘邮件‘)

    roles=models.ManyToManyField(to=‘Role‘,verbose_name=‘具有的所有角色‘,blank=True)
    class Meta:
        verbose_name_plural=‘用户表‘

    def __str__(self):
        return self.username

class Permissions(models.Model):
    title=models.CharField(max_length=64,verbose_name=‘标题‘)
    url=models.CharField(max_length=64,verbose_name=‘含规则URL‘)
    is_menu =models.BooleanField(verbose_name=‘是否是菜单‘)

    class Meta:
        verbose_name_plural=‘权限表‘

    def __str__(self):
        return self.title

class Role(models.Model):
    title=models.CharField(max_length=32)

    permissions=models.ManyToManyField(to=‘Permissions‘,verbose_name=‘具有的所有权限‘,blank=True)

    class Meta:
        verbose_name_plural=‘角色表‘

    def __str__(self):
        return self.title

  

3. 权限录入:

CEO:番禺
/userinfo/
/userinfo/add/
/userinfo/edit/(\d+)/
/userinfo/del/(\d+)/
/order/
/order/add/
/order/edit/(\d+)/
/order/del/(\d+)/
总监:鲁宁
/userinfo/
/userinfo/add/
/order/
/order/add/
经理:肾松
/userinfo/
/order/
业务员:肾松,文飞,成栋
/order/

PS: 去重

问题:
1. 用户登录
- 获取当前用户具有的所有角色
- 获取当前用户具有的所有权限
- 获取当前用户具有的所有权限(去重)

  

4. 权限梳理

a. 创建rbac app 
b. 创建表结构,rbac,基于角色权限控制
- 三个类
- 五张表

c. 基于Django admin录入权限数据	
python manage.py createsuperuser
- root
- root!2345

d. 用户登录程序
- 获取当前用户具有的所有权限(去重)
- 获取权限中的url,放置到session中
rabc.service.init_permission
def init_permission(user,request):
pass

e. 中间件 
- 白名单
- 获取请求URL
- session保存的权限信息
- 循环url,re.match(db_url, current_url)

  



5. rbac中的代码:

- models.py
- admin.py
- service.init_permission.py     #权限攻击组件
- middlewares.rabc.py        #中间件

配置文件中setting配置白名单:
VALID_URL = [ "/login/", "/admin.*" ]

 6 代码展示

 6.1 E:\Django项目练习03\rbac\service\init_permissions.py

def init_permissions(user,request):
    url_list = []
    # 获取user中所有的url权限
    permission_url_list = user.roles.values(‘permissions__url‘, ‘permissions__title‘, ‘permissions__is_menu‘).distinct()
    # 将url权限去重添加到url_list列表中
    for item in permission_url_list:
        url_list.append(item[‘permissions__url‘])

    print(‘url_list:‘,url_list)
    # 定制session
    request.session[‘permission_url_list‘] = url_list

 6.2 中间件setting配置

MIDDLEWARE = [
    ‘django.middleware.security.SecurityMiddleware‘,
    ‘django.contrib.sessions.middleware.SessionMiddleware‘,
    ‘django.middleware.common.CommonMiddleware‘,
    ‘django.middleware.csrf.CsrfViewMiddleware‘,
    ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
    ‘django.contrib.messages.middleware.MessageMiddleware‘,
    ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
    ‘rbac.middlewares.rbac.RbacMiddleware‘     #权限管理组件引用路径
]

 6.3 rbac.py文件代码 E:\Django项目练习03\rbac\middlewares\rbac.py

import re
from django.shortcuts import  render,redirect,HttpResponse
from django.conf import settings

class MiddlewareMixin(object):
    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, ‘process_request‘):
            response = self.process_request(request)
        if not response:
            response = self.get_response(request)
        if hasattr(self, ‘process_response‘):
            response = self.process_response(request, response)
        return response

class RbacMiddleware(MiddlewareMixin):
    def process_request(self,request):
        # 1.获取当前的请求url:request.path_info
        # 2.获取session中保存当前用户的权限
        #   request.session.get("permission_url_list")

        current_url = request.path_info
        # 当前请求不需要执行权限验证
        for url in settings.VALID_URL:
            if re.match(url,current_url):
                return None
        permission_list = request.session.get("permission_url_list")
        print(‘permission_list‘,permission_list)

        if not permission_list:
            return redirect(‘/login/‘)

        flag=False
        for db_url in permission_list:
            regax="^{0}$".format(db_url)
            if re.match(regax,current_url):
                flag =True
                break

        if not flag:
            return HttpResponse(‘无权访问‘)

 6.4 使用rbac组件 应用路径:E:\Django项目练习03\app01\views.py

from django.shortcuts import render,redirect,HttpResponse
from app01 import models

from rbac.service.init_permissions import init_permissions  

def login(request):
    if request.method=="GET":
        return render(request,‘login.html‘)
    else:
        username=request.POST.get(‘user‘)
        password=request.POST.get(‘pwd‘)
        user=models.UserInfo.objects.filter(username=username,password=password).first()
        if not user:
            return render(request,‘login.html‘)
        else:
            init_permissions(user,request)    #定制session模块

            return redirect(‘/index/‘)

def index(request):
    return HttpResponse(‘首页页面‘)


def userinfo(request):
    return HttpResponse(‘用户管理‘)


def userinfo_add(request):
    return HttpResponse(‘添加用户‘)


def order(request):
    return HttpResponse(‘订单管理‘)


def order_add(request):
    return HttpResponse(‘添加订单‘)

 6.5 路由文件配置

from django.conf.urls import url
from django.contrib import admin
from app01 import  views as app01_views
urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^login/‘, app01_views.login),
    url(r‘^index/‘, app01_views.index),
    url(r‘^userinfo/$‘, app01_views.userinfo),
    url(r‘^userinfo/add/$‘, app01_views.userinfo_add),
    url(r‘^order/$‘, app01_views.order),
    url(r‘^order/add/$‘, app01_views.order_add),
]

  

 






以上是关于Django web框架之权限管理一的主要内容,如果未能解决你的问题,请参考以下文章

2020Python修炼记web框架之 权限管理+Auth模块

Python之Web框架Django

Python之Web框架Django

译丨Yarn - Javascript 新一代套件管理

Web框架之Django_02基本操作(Django项目启动配置数据库连接orm增删改查)

Python Web框架之Django初探