zoukankan      html  css  js  c++  java
  • 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存放的数据可以存放在内存中

      取数据的效率高.

        

        

  • 相关阅读:
    算法初步——贪心B1020/A1070月饼
    class.forname()用法 转
    java的几种连接池
    java中调用xml的方法:DocumentBuilderFactory
    java中HashMap详解
    使用J2SE API读取Properties文件的六种方法
    java读取properties配置文件信息
    学习(二)
    json入门(二)
    什么是序列化?在什么情况下将类序列化?
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9872794.html
Copyright © 2011-2022 走看看