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
python Django框架实现自定义表单提交
Mar 25 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
Python的bit_length函数来二进制的位数方法
Aug 27 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
python如何控制进程或者线程的个数
Oct 16 Python
Python字典dict常用方法函数实例
Nov 09 Python
python wsgiref源码解析
Feb 06 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在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
php取得字符串首字母的方法
2015/03/25 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
laravel请求参数校验方法
2019/10/10 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
jquery blockUI 遮罩不能消失与不能提交的解决方法
2011/09/17 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
小程序实现多选框功能
2018/10/30 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python多线程与多进程及其区别详解
2019/08/08 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
硕士研究生自我鉴定
2013/11/08 职场文书
服装厂厂长职责
2013/12/16 职场文书
主管会计岗位责任制
2014/02/10 职场文书
软件售后服务方案
2014/05/29 职场文书
2014年煤矿工作总结
2014/11/24 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书