需求: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('没有权限')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“Django web自定义通用权限控制实现方法”评论...
更新日志
2024年11月08日
2024年11月08日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]