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实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
Python自定义简单图轴简单实例
Jan 08 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
Python调用服务接口的实例
Jan 03 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
Python实现分段线性插值
2018/12/17 Python
python实现转圈打印矩阵
2019/03/02 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
护士自我评价范文
2014/01/25 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
公司表扬稿范文
2015/05/05 职场文书
法人代表资格证明书
2015/06/18 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
导游词之安徽九华山
2019/09/18 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
Python实现生活常识解答机器人
2021/06/28 Python
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL