Django web自定义通用权限控制实现方法

作者:yoyo008 时间:2021-07-31 06:21:09 

需求: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

标签:Django,web,自定义,权限,控制
0
投稿

猜你喜欢

  • 基于django ManyToMany 使用的注意事项详解

    2022-10-16 00:29:33
  • 如何基于线程池提升request模块效率

    2023-06-12 11:13:44
  • mysql常用监控脚本命令整理

    2024-01-16 14:42:07
  • 识别操作系统是不是vista的js代码

    2013-10-20 19:08:25
  • php教程之phpize使用方法

    2024-05-02 17:16:46
  • ASP.NET MVC Bundles 用法和说明(打包javascript和css)

    2023-07-17 01:20:59
  • 如何利用python turtle绘图自定义画布背景颜色

    2021-08-02 17:28:49
  • Python中typing模块的具体使用

    2022-03-25 13:02:08
  • Python中删除文件的几种方法实例

    2021-02-02 05:57:13
  • 详解thinkphp+redis+队列的实现代码

    2024-05-11 10:08:34
  • MySQL 修改密码实例详解

    2024-01-27 05:36:28
  • Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

    2022-03-02 16:50:47
  • golang grpc配置使用实战

    2024-02-06 01:17:09
  • 如何将JSP/Servlet项目转换为Spring Boot项目

    2023-06-19 16:23:06
  • Python 用NumPy创建二维数组的案例

    2021-11-23 22:27:48
  • SQL Join的一些总结(实例)

    2012-08-21 10:19:29
  • 浅谈Javascript中的事件流和事件绑定

    2009-07-20 17:13:00
  • Python学习小技巧之列表项的排序

    2022-03-31 12:06:12
  • Python使用Selenium爬取淘宝异步加载的数据方法

    2021-05-17 05:31:57
  • python 拷贝特定后缀名文件,并保留原始目录结构的实例

    2021-08-30 04:17:46
  • asp之家 网络编程 m.aspxhome.com