• 79 权限的管理


    主要内容:

    权限: 不用的用户对应不同的功能, (web开发中 url约等于权限)

    表结构的设计:

      a : 权限表  

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

      b : 角色表:

    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 Meta:
            verbose_name = '角色表'
            verbose_name_plural = '角色表'
    

      c : 用户表

    class User(models.Model):
        username = 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.username
    

    3 : 注意事项:

      代码的主要流程:

        1 先获取post提交过来的数据

         2 从数据库中找到该对象, 如果没有该对象, 直接跳转到登录页面

         3 如果有该对象,  获取该用户所拥有的权限, 记录在session中, 

         4 由于每次访问都需要校验, 是否是该用户所拥有的权限, 所以把次校验的内容写入中间件中, 

        5 中间件里的内容: 如果是白名单, 例如登录, 注销, 注册, admin, 则不需要校验, 直接结束, 

        6 如果不是白名单, 先获取当前的url, 然后for循环session里的数据, 看url在不在session里, 如果在, 结束,进入后面的流程, 如果不在返回一个httpresponse响应(该用户没有权限).

        7 由于编辑的时候后面带有动态的数据, 所以用到正则匹配. 

        8 可以在setting里动的设置一些东西, 例如把session里的key写入setting里, 还有就是把白名单写入setting里

    PERMISSION_SESSION_KEY = 'permissions'
    WHITE_URL_LIST = [
            r'^/login/$',
            r'^/logout/$',
            r'^/reg/$',
            r'^/admin/.*',
    ]
    

          在取的时候的用法:

    from django.conf import settings
    request.session[settings.PERMISSION_SESSION_KEY] = permission_list
    

        8 跨字段的查询:

      从用户表中查出用户所拥有的权限

                      角色对象 角色表中的字段跨权限中的字段

    permission_qs = user.roles.all().filter(permissions__url__isnull=False).values_list( 'permissions__url' )

    往数据库写数据的两种方式:

      1 直接从数据库中填数据

      2 可以使用admin管理权限,  首先注册一个超级用户, 然后再admin中写下一下代码:

    from django.contrib import admin
    from crm_app import models
    admin.site.register(models.Customer)
    admin.site.register(models.ClassList)
    admin.site.register(models.Campuses)
    

    5 为什么使用session存放数据:

      因为session存放的数据可以存放在内存中

      取数据的效率高.

        

        

  • 相关阅读:
    Vue3+Element-Plus-admin
    uniapp UI库推荐 uView官网/文档
    js 获取本月月初和月末时间操作
    el-dialog 无法弹出来
    Vue核心技术 Vue+Vue-Router+Vuex+SSR实战精讲
    sed 相关命令
    docker 启动 ubuntu
    vue 配置 history 模式
    typescript 相关
    fiddler 图片下载
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9872794.html
Copyright © 2020-2023  润新知