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使用cookie库操保存cookie详解
Mar 03 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python文件操作整理汇总
Oct 21 Python
python实现读取并显示图片的两种方法
Jan 13 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
django中的HTML控件及参数传递方法
Mar 20 Python
python3实现windows下同名进程监控
Jun 21 Python
使用python判断你是青少年还是老年人
Nov 29 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
Python logging设置和logger解析
Aug 28 Python
如何使用 Flask 做一个评论系统
Nov 27 Python
编写python程序的90条建议
Apr 14 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判断变量是否为0的方法
2014/02/08 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
js中生成map对象的方法
2014/01/09 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
乡下人家教学反思
2014/02/01 职场文书
《乌塔》教学反思
2014/02/17 职场文书
挂科检讨书范文
2014/02/20 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
特岗教师个人总结
2015/02/10 职场文书