Django web自定义通用权限控制实现方法
作者:yoyo008 发布时间:2021-07-31 06:21:09
标签:Django,web,自定义,权限,控制
需求: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('没有权限')
来源:https://www.cnblogs.com/yoyo008/p/9225352.html
0
投稿
猜你喜欢
- 在做项目的过程中,我们经常会建立各种各样的规范,以方便团队之间更好的合作更好的完成项目;同样我们也经常会听到各种各样的协议,比如Google
- 本文实例讲述了Python实现html转换为pdf报告(生成pdf报告)功能。分享给大家供大家参考,具体如下:1、先说下html转换为pdf
- 从98年某月某日我的第一个个人猪页诞生.到2008年的今天.宣告了我从事设计行业整整十年.十年,很多变化,从摆弄个人猪页到现在以做设计为生,
- 今天我去隽辰的博客去看他的文章,在读完他的文章之后,我很自然的就去读网友们给他留的评论,在读的时候我发现他的评论是顺序的,也就是最早的评论在
- 很早以前就说过,IE8的标准模式已经不再支持滤镜了,不过IE仍然留了一条后路,你可以在CSS中这样写滤镜:-ms-filter
- 公司在codereview的时候限制了看代码的时间,实际上不少代码属于框架自动生成,并不需要花费太多时间看,为了达标,需要刷点时间(鼠标点击
- 先来了解一下收/发邮件有哪些协议:SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议。
- SQL Server 的扩展存储过程,其实就是一个普通的 Windows DLL,只不过按照某种规则实现了某些函数而已。近日在写一个扩展存储
- 根据“廖雪峰”的教程进行python学习,计划每天抽出1-2个小时的时间进行充电。Python是著名的“龟叔”Guido van Rossu
- 今天终于可以用wxPython开发GUI程序了,非常高兴。把其中的一些注意点写下来以供参考。在windows XP平台下,首先需要做以下环境
- 函数名:chk_Email()'返回值:布尔值(True为通过,False为未通过)'参数:email(需要判断的email
- 在pycharm使用过程中,对于每次新建文件的编码格式和关于代码编写者的一些个人信息快捷填写,方法如下:1.打开pycharm,选择File
- 1.今天网上下载一个博客项目,发现本地访问,js,css加载不了.我想应该是项目上线的安全措施,但是我想调试项目.找到方法如下在settin
- 在实际的项目中,我们一般都会建立三个环境:开发、测试和生产环境,这三种环境会使用不同的配置组合,为了能方便地切换配置,我们可以为不同的环境创
- 创建类from django.forms import ModelFormfrom django.forms import widgets
- 前言1 简介Kepler.gl作为一款强大的开源地理信息数据可视化工具,可以帮助我们轻松制作针对大规模矢量数据的可视化作品,从而辅助数据分析
- 一、 基础使用1.1 logging使用场景日志是什么?这个不用多解释。百分之九十的程序都需要提供日志功能。Python内置的logging
- 远程(如通过互联网)连接access数据库的示例:首先,需要使用TCP/IP,ADO及XML(需要安装Microsoft XML 4.0。)
- 我为什么做这项工作?其实这项工作是另一位同事在做,过程中发下了一些问题,但是种种原因log和数据都没有收集到,无法进行分析。然后我就接手了,
- 兼容当前HTML/XHTML文档是否有DTD声明:以下为程序代码:var xtop = document.documentElement.s