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的Tornado框架实现数据可视化的教程
May 02 Python
使用Python对Excel进行读写操作
Mar 30 Python
python版学生管理系统
Jan 10 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
浅谈Python中的bs4基础
Oct 21 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
tensorflow转换ckpt为savermodel模型的实现
May 25 Python
python输入中文的实例方法
Sep 14 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
Python实现为PDF去除水印的示例代码
Apr 03 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使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
JavaScript 注册事件代码
2011/01/27 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
JS表的模拟方法
2015/02/05 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
Python中turtle作图示例
2017/11/15 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
给女朋友的道歉信
2014/01/10 职场文书
模范教师事迹材料
2014/02/10 职场文书
婚宴来宾致辞
2015/07/28 职场文书
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS