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 中的with关键字使用详解
Sep 11 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
Python实现定时精度可调节的定时器
Apr 15 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
详解python中list的使用
Mar 15 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
python线程定时器Timer实现原理解析
Nov 30 Python
python和js交互调用的方法
Jun 23 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
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
php流量统计功能的实现代码
2012/09/29 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
用javascript获取textarea中的光标位置
2008/05/06 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
Django 创建后台,配置sqlite3教程
2019/11/18 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
合作协议书
2014/04/23 职场文书
活动总结书
2014/05/08 职场文书
素质教育标语
2014/06/27 职场文书
避暑山庄导游词
2015/02/04 职场文书
法定代表人免职证明
2015/06/24 职场文书
外出听课学习心得体会
2016/01/15 职场文书
SQL写法--行行比较
2021/08/23 SQL Server
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python