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运行效率
Jun 09 Python
Python 异常处理的实例详解
Sep 11 Python
unittest+coverage单元测试代码覆盖操作实例详解
Apr 04 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
Django和Flask框架优缺点对比
Oct 24 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
Python 发送SMTP邮件的简单教程
Jun 24 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 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 生成随机验证码图片代码
2010/02/08 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
python strip()函数 介绍
2013/05/24 Python
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
python字典操作实例详解
2017/11/16 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
什么是GWT的Module
2013/01/20 面试题
人力资源经理的岗位职责范本
2014/02/28 职场文书
计算机专业求职信
2014/06/02 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
六一儿童节新闻稿
2015/07/17 职场文书