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 11 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
如何实现删除numpy.array中的行或列
May 08 Python
通过Pandas读取大文件的实例
Jun 07 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
python pandas库的安装和创建
Jan 10 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 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中文分词 自动获取关键词介绍
2012/11/13 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
限制文本框输入N个字符的js代码
2010/05/13 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
vue实现计步器功能
2019/11/01 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
对python 生成拼接xml报文的示例详解
2018/12/28 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
优秀毕业生推荐信
2013/11/02 职场文书
统计员岗位职责
2013/11/14 职场文书
正规的求职信范文分享
2013/12/11 职场文书
员工年终演讲稿
2014/01/03 职场文书
个人近期表现材料
2014/02/11 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
六年级学生期末评语
2014/12/26 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
开业典礼致辞
2015/07/29 职场文书