• Django项目的权限问题


    引子:

      1.为什么需要权限?

      由于用户的身份不同,我们需要根据他的角色来给其赋予不同的权限,以便更好分工且避免责任不明确的问题。

      2.为什么要开发一个权限组件?

      权限问题对于大多数系统都会用到,根据当前实际开发出一套比较完备的权限组件,当业务需要时根据具体业务适当修改,可大量节省开发时间,提高开发效率。

      3.再WEB开发中什么是权限?

      URL约等于权限,给某用户访问某URL的权限,就是给了他该url对应模块的使用权限。

    权限设计的步骤

    一  权限表的设计

      1.权限表

      

      2.角色表

      3.用户表

    二 具体权限逻辑的实现

      1.写登录函数

     1 from django.shortcuts import render, redirect
     2 from rbac import models
     3 from django.conf import settings
     4 def login(request):
     5     if request.method=='POST':
     6         username=request.POST.get('user')
     7         password=request.POST.get('pwd')
          用户校验
    8 user=models.UserInfo.objects.filter(name=username,password=password).first() 9 if not user: 10 return render(request,'login.html',{'err_msg':'用户名或密码错误'})
          校验完成后写到session中
    11 permission_list=user.roles.filter(permissions__url__isnull=False).values('permissions__url').distinct() 12 request.session[settings.PERMISSION_SESSION_KEY]=list(permission_list) ---->permission_list为一个QuerySet对象,无法进行JSON操作,故须先进行强制转化 13 request.session['user_info']={'id':user.id,'name':user.name} 14 return redirect('/customer/list/') 15 return render(request,"login.html")

      2.对权限进行校验  

        写在中间件中 process_request   

     1 from django.utils.deprecation import MiddlewareMixin
     2 from django.conf import settings
     3 import re
     4 from django.shortcuts import render, redirect,HttpResponse
     5 class  RbacPermissionMiddleware(MiddlewareMixin):
     6     def process_request(self,request):
     7         # 1.获取当前路径
     8         current_url=request.path_info
     9         for i in settings.VALID_URL_LIST:  #白名单 里面的URL不需要做校验
    10             if re.match(i,current_url):
    11                 return
    12         # 2.获取当前用户的所有权限
    13         permission_list=request.session.get(settings.PERMISSION_SESSION_KEY)
    14         # 3.校验权限
    15         flag=False
    16         for item in permission_list:
    17             reg=item['permissions__url']
    18             if re.match("^%s$"%reg,current_url):
    19                 flag=True
    20                 break
    21         # 校验不通过,返回错误信息        
    22         if not flag:
    23             return HttpResponse('无权访问')

       注意:中间件在使用前一定要在settings中注册   

    VALID_URL_LIST= [
    '^/login/$',
    '^/reg/$',
    '^/admin/.*$',
    ]
  • 相关阅读:
    MongoDB学习笔记(二)
    mongoDB学习笔记(一)
    docker官方文档笔记
    nagios
    网络流量状态命令总结 (含notp安装)
    other
    一键搭建LNMP脚本
    linux问题总结
    linux中VI编写C程序。。。
    centos 7 安装python3.5.1
  • 原文地址:https://www.cnblogs.com/wdbgqq/p/9759583.html
Copyright © 2020-2023  润新知