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使用cStringIO实现临时内存文件访问的方法
Mar 26 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
基于python监控程序是否关闭
Jan 14 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 Python
Python极值整数的边界探讨分析
Sep 15 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
Codeigniter的dom类用法实例
2015/06/26 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
JavaScript每天必学之基础知识
2016/09/17 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
python多进程重复加载的解决方式
2019/12/13 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
银行会计职员个人的自我评价
2013/09/29 职场文书
人力资源经理自我评价
2014/01/04 职场文书
酒店个人求职信范文
2014/01/25 职场文书
经典婚礼主持词
2014/03/13 职场文书
团队经理竞聘书
2014/03/31 职场文书
课外活动实习计划
2015/01/19 职场文书
民主生活会主持词
2015/07/01 职场文书
培训感想范文
2015/08/07 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
导游词之峨眉山
2019/12/16 职场文书
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫