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存放的数据可以存放在内存中

  取数据的效率高.

    

    

原文地址:https://www.cnblogs.com/gyh412724/p/9872794.html