权限管理

权限管理 RBAC

 

  1. 权限管理

1. 为什么要有权限?

   

2. 开发一套权限的组件。为什么要开发组件?

 

3. 权限是什么?

web 开发中 URL 约等于 权限

 

4. 表结构的设计

 

权限表

ID URL

1 /customer/list/

2 /customer/add/

 

 

用户表

ID name pwd

1 ward 123

 

 

用户和权限的关系表(多对多)

ID user_id permission_id

1 1 1

1 1 2

 

5. 写代码

1. 查询出用户的权限写入session

2. 读取权限信息,判断是否有权限

 

最初版的权限管理梳理流程

表结构

from django.db import models


class Permission(models.Model):
   """
  权限表
  """
   title = models.CharField(max_length=32, verbose_name='标题')
   url = models.CharField(max_length=32, verbose_name='权限')
   
   class Meta:
       verbose_name_plural = '权限表'
       verbose_name = '权限表'
   
   def __str__(self):
       return self.title


class Role(models.Model):
   name = models.CharField(max_length=32, verbose_name='角色名称')
   permissions = models.ManyToManyField(to='Permission', verbose_name='角色所拥有的权限', blank=True)
   
   def __str__(self):
       return self.name


class User(models.Model):
   """
  用户表
  """
   name = models.CharField(max_length=32, verbose_name='用户名')
   password = models.CharField(max_length=32, verbose_name='密码')
   roles = models.ManyToManyField(to='Role', verbose_name='用户所拥有的角色', blank=True)
   
   def __str__(self):
       return self.name
  • settings文件配置

    • #  ###### 权限相关的配置 ######
      PERMISSION_SESSION_KEY = 'permissions'
      WHITE_URL_LIST = [
         r'^/login/$',
         r'^/logout/$',
         r'^/reg/$',
         r'^/admin/.*',
      ]
  • 其实权限就是用户能够访问那些url,不能访问那些url,我们所做的就是将每个不同身份的人

    分配不同的url

  • 在最初用户登录的时候就查询出用户的权限。并将此次权限存入到session中

    • 为什么要存入session中啊,为了不重复读取数据库,存到session中

      我们可以配置session然后将session存到缓存中(非关系型数据库中)

      这样读取的速度回很快

  • 登录成功后如何查看当前用户的权限并将其写入到session中

    • from django.shortcuts import render, HttpResponse, redirect, reverse
      from rbac import models
      from django.conf import settings

      ...

      user = models.User.objects.filter(name=username, password=pwd).first()
      # 登录成功
             # 将权限信息写入到session
             
             # 1. 查当前登录用户拥有的权限
             permission_list = user.roles.filter(permissions__url__isnull=False).values_list(
                                                                                        'permissions__url').distinct()
             # for i in permission_list:
             #     print(i)
             
             # 2. 将权限信息写入到session # 这里的键值我们做了全局配置
             request.session[settings.PERMISSION_SESSION_KEY] = list(permission_list)
             # 得到的permission_list是一个QuerySet的元组对象,因为session的存储是有数据类型限制所以转换为列表(列表中套元组)
  • 然后,该用户能够访问那些,不能访问那些,这时,我们可以将这个逻辑写在中间件这里

    • from django.utils.deprecation import MiddlewareMixin
      from django.conf import settings
      from django.shortcuts import HttpResponse
      import re


      class PermissionMiddleware(MiddlewareMixin):
         # 每一个请求来,都会走这个钩子函数
         def process_request(self, request):
             # 对权限进行校验
             # 1. 当前访问的URL
             current_url = request.path_info

             # 白名单的判断我们这里将白名单设置在了settings中,往settings中加就ok
             for i in settings.WHITE_URL_LIST:
                 if re.match(i, current_url):
                     return

             # 2. 获取当前用户的所有权限信息
             permission_list = request.session.get(settings.PERMISSION_SESSION_KEY)
             # 3. 权限的校验
             print(current_url)  # Django的session做了转换将元组转换成为一个列表
             for item in permission_list:
                 url = item[0]
                 if re.match("^{}$".format(url), current_url):
                     return
             else:
                 return HttpResponse('没有权限')
    •  

原文地址:https://www.cnblogs.com/xiao-xue-di/p/9872751.html