Django web自定义通用权限控制实现方法


Posted in Python onNovember 24, 2020

需求:web系统有包含以下5个url,分别对于不同资源;

1、stu/add_stu/

2、stu/upload_homework/

3、stu/query_homework/

4、stu/add_record/

--------------------------------------------------------------------------------------------------------

学生可以访问:2,3

老师可以访问:1,4

可以通过基于角色对用户权限进行控制:

一、数据模型

1、用户表:用户表和角色表为多对多关系,1个用户可以有多个角色,1个角色可以被多个用户划分;

email = models.EmailField(
  verbose_name='email address',
  max_length=255,
  unique=True,
)
 password = models.CharField(_('password'),max_length=128,\
               help_text=mark_safe('''<a href ="password/" >修改密码</a>'''))
name = models.CharField(max_length=32,help_text='用户登陆后请修改为真实名字')
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
role = models.ManyToManyField("Role")

def __str__(self):
  return self.email

2、角色表:

class Role(models.Model):
  """角色表"""
  name = models.CharField(unique=True,max_length=32)
  menus = models.ManyToManyField("Menu")
  def __str__(self):
    return self.name

3、菜单表:

class Menu(models.Model):
  """动态菜单"""
  name = models.CharField(unique=True,max_length=32)
  url_type = models.SmallIntegerField(choices=((0,'relative_name'),(1,'absolute_url')))
  url_name = models.CharField(unique=True,max_length=128)

  def __str__(self):
    return self.name

二、前端根据用户权限生成菜单

<div class="container-fluid">
 <div class="row">
   {% block side-bar %}
  <div class="col-sm-3 col-md-2 sidebar">
   <ul class="nav nav-sidebar">
    {% block side-bar-menus %}
       {% for role in request.user.userprofile.roles.all %}
        <hr>
        {% for menu in role.menus.all %}
         <li>
           <a href="{% if menu.url_type == 0 %}{% url menu.url_name %}{% else %} {{ menu.url_name }}{% endif %}" rel="external nofollow"  >
           {{ menu.name }}
           </a>
         </li>
        {% endfor %}
      {% endfor %}
    {% endblock %}
    </ul>
  </div>
   {% endblock %}

这样就可以根据用户生成菜单,但是如果用户不是通过菜单方法,而是直接通过url访问,后台还是没有对这些url进行控制

三、后台根据用户权限控制菜单访问

装饰器:

简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。

class Mddile1(MiddlewareMixin):
  def process_request(self,request):
    #如果用户访问的url是登录、注册页面,记录到白名单,放行
    for url in settings.PASS_URL_LIST:
      if re.match(url,request.path_info):
        return None
    Permission_url_list=request.session.get(settings.SESSION_PERMISSION_URL_KEY)
    #如果用户访问的url 不在当前用户权限之内 返回login页面
    if not Permission_url_list:
      return redirect(settings.LOGIN_URL)
    current_url=request.path_info
    #由于数据库的数据,可能是正则所有 一定要精确匹配
    flag=False
    for url in Permission_url_list:
      url='^%s$'%(url)
      if re.match(url,current_url):
        flag=True
        break
    if not flag:
      if settings.DEBUG: #如果是程序调试应该 显示用户可以访问的权限
        url_html='<br/>'.join(Permission_url_list)
        return HttpResponse('无权访问您可以访问%s'%url_html)
      else:
        return HttpResponse('没有权限')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中给List添加元素的4种方法分享
Nov 28 Python
对Python进行数据分析_关于Package的安装问题
May 22 Python
python的socket编程入门
Jan 29 Python
Python高级用法总结
May 26 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
python字典改变value值方法总结
Jun 21 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
Python如何把字典写入到CSV文件的方法示例
Aug 23 Python
python+selenium自动化实战携带cookies模拟登陆微博
Jan 19 Python
Python源码解析之List
May 21 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 #Python
Pycharm安装python库的方法
Nov 24 #Python
python opencv角点检测连线功能的实现代码
Nov 24 #Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 #Python
Python利用myqr库创建自己的二维码
Nov 24 #Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 #Python
python中使用.py配置文件的方法详解
Nov 23 #Python
You might like
用PHP调用Oracle存储过程
2006/10/09 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
开启PHP的伪静态模式
2015/12/31 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
python线程优先级队列知识点总结
2021/02/28 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
大学生简单自荐信
2013/11/10 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python