zoukankan      html  css  js  c++  java
  • 权限管理

    权限管理 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('没有权限')
      •  

  • 相关阅读:
    streamsets docker 安装试用
    使用graphql-code-generator 生成graphql 代码
    ORA-12537:TNS:connectionclosed错误处理过程
    解决Oracle 11gR2 空闲连接过多,导致连接数满的问题
    ORACLE定期清理INACTIVE会话
    Oracle session active 和 inactive 状态 说明
    如何查看数据库软件共创建了多少个库(实例)
    某表空间增长很快,但找不到是哪一个表造成的
    Oracle用户被锁定解决方法
    Oracle的sqlnet.ora文件配置
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/9872751.html
Copyright © 2011-2022 走看看