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彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
python学习教程之使用py2exe打包
Sep 24 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
python表格存取的方法
Mar 07 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
Django之模型层多表操作的实现
Jan 08 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python 处理日期时间的Arrow库使用
Aug 18 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 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数组合并的二种方法
2014/03/21 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
php use和include区别总结
2019/10/13 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
详谈javascript异步编程
2016/02/21 Javascript
Bootstrap表单布局
2016/07/19 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
python访问类中docstring注释的实现方法
2015/05/04 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
迪拜航空官方网站:flydubai
2017/04/20 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
临床医学应届生求职信
2013/11/06 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
捐助感谢信
2015/01/22 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
文明礼仪主题班会
2015/08/13 职场文书
java设计模式--七大原则详解
2021/07/21 Java/Android