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类的动态修改的实例方法
Mar 24 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
利用python脚本如何简化jar操作命令
Feb 24 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
python用opencv完成图像分割并进行目标物的提取
May 25 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
Python同时处理多个异常的方法
Jul 28 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将向Java靠拢
2006/10/09 PHP
十天学会php之第七天
2006/10/09 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
javascript中的几个运算符
2007/06/29 Javascript
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
幼儿园门卫制度
2014/01/29 职场文书
继承权公证书
2014/04/09 职场文书
法定代表人授权委托书
2014/09/19 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫