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='emailaddress', max_length=255, unique=True, ) password=models.CharField(_('password'),max_length=128,\ help_text=mark_safe('''修改密码''')) 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): returnself.email
2、角色表:
classRole(models.Model): """角色表""" name=models.CharField(unique=True,max_length=32) menus=models.ManyToManyField("Menu") def__str__(self): returnself.name
3、菜单表:
classMenu(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): returnself.name
二、前端根据用户权限生成菜单
{%blockside-bar%} {%blockside-bar-menus%} {%forroleinrequest.user.userprofile.roles.all%}
{%formenuinrole.menus.all%}{%endfor%} {%endfor%} {%endblock%} {{menu.name}}
这样就可以根据用户生成菜单,但是如果用户不是通过菜单方法,而是直接通过url访问,后台还是没有对这些url进行控制
三、后台根据用户权限控制菜单访问
装饰器:
简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
classMddile1(MiddlewareMixin): defprocess_request(self,request): #如果用户访问的url是登录、注册页面,记录到白名单,放行 forurlinsettings.PASS_URL_LIST: ifre.match(url,request.path_info): returnNone Permission_url_list=request.session.get(settings.SESSION_PERMISSION_URL_KEY) #如果用户访问的url不在当前用户权限之内返回login页面 ifnotPermission_url_list: returnredirect(settings.LOGIN_URL) current_url=request.path_info #由于数据库的数据,可能是正则所有一定要精确匹配 flag=False forurlinPermission_url_list: url='^%s$'%(url) ifre.match(url,current_url): flag=True break ifnotflag: ifsettings.DEBUG:#如果是程序调试应该显示用户可以访问的权限 url_html='
'.join(Permission_url_list) returnHttpResponse('无权访问您可以访问%s'%url_html) else: returnHttpResponse('没有权限')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。