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二叉树的实现实例
Nov 21 Python
Python调用C语言开发的共享库方法实例
Mar 18 Python
使用Python对微信好友进行数据分析
Jun 27 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
Python多线程正确用法实例解析
May 30 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
Python3获取cookie常用三种方案
Oct 05 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
博士208HAF收音机实习报告
2021/03/02 无线电
一个简单的MySQL数据浏览器
2006/10/09 PHP
生成静态页面的php函数,php爱好者站推荐
2007/03/19 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
详细讲解JS节点知识
2010/01/31 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
Python中动态创建类实例的方法
2017/03/24 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python email smtplib模块发送邮件代码实例
2018/04/26 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
tensorboard显示空白的解决
2020/02/15 Python
python对一个数向上取整的实例方法
2020/06/18 Python
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
门卫岗位职责
2013/11/15 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
司法所长先进事迹
2014/06/02 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
初二英语教学反思
2016/02/15 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python