分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

django web 自定义通用权限控制

发布时间:2023-09-06 02:01责任编辑:郭大石关键词:django

需求: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 %}" ?>
?????????????????????{{ 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(‘没有权限‘)

django web 自定义通用权限控制

原文地址:https://www.cnblogs.com/yoyo008/p/9225352.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved