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 01 Python
Python作用域用法实例详解
Mar 15 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
Jan 07 Python
Python操作mongodb的9个步骤
Jun 04 Python
python矩阵的转置和逆转实例
Dec 12 Python
Pytorch之parameters的使用
Dec 31 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 Python
Python logging日志模块 配置文件方式
Jul 12 Python
matplotlib 三维图表绘制方法简介
Sep 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 移除数组重复元素的一点说明
2008/11/27 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
php调用c接口无错版介绍
2014/03/11 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
js日历功能对象
2012/01/12 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
jQuery 选择器详解
2015/01/19 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
pyqt和pyside开发图形化界面
2014/01/22 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
Python高级property属性用法实例分析
2019/11/19 Python
pandas中ix的使用详细讲解
2020/03/09 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
小班开学寄语
2014/04/04 职场文书
实习护士自荐信
2014/06/21 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
授权委托书(完整版)
2014/09/10 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
高中信息技术教学反思
2016/02/16 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
React四级菜单的实现
2022/04/08 Javascript