ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django的RBAC权限认证机制和后台运营admin站点

2022-08-07 23:32:27  阅读:191  来源: 互联网

标签:verbose admin db django RBAC models name


一 RBAC权限认证机制

RBAC(Role-Base Access Control),译作:基于角色分配的访问控制机制。实现了权限认证机制以后,我们可以让不同的用户得到不同的权限,基于用户拥有的权限不同,能操作的功能或者能看到的站点内容也会产生不一样。

一般用于项目权限的分配机制无非3种:RBAC,OAuth授权认证、RLS(Row Level Security的缩写、译作:行级数据安全)。

在网站后台运营站点这种单个站点内部,单个站点集群场景下,一般使用的都是RBAC。

在对外开发的业务站点中,基于不同的渠道,不同的领域,不同站点之间,一般都是使用OAuth2.0授权认证。

在对外开发的站点服务,如果配置多台前后台的租赁模式,多数使用RLS权限机制。

一 RBAC的实现

因为项目业务的复杂程度不一致。所以存在有3表RBAC或5表RBAC的实现方案。django的admin站点实际上就是基于5表RBAC的实现方案扩展出来的6表RBAC认证机制。

  描述 视图

3表RBAC认证

使用了3张表保存了权限相关的所有数据,这3张表分别是用户表(user),角色表(role/group/department),权限表(permission/auth。

常见的场景:单个网站:小论坛,小商城,普通的后台站点。

5表RBAC认证

在3表的基础上新增了2张关系表保存权限相关的所有数据,这5张表分别是用户表(user),角色表(role/group),权限表(permission/auth),

以及新增的2张关系表:用户与角色之间的关系表(user_group)和角色与权限的关系表(group_permission)。

常见的业务场景:大型综合论坛,大型的商城(商家入驻),有分公司的企业内部站点,OA、ORM、ERP、权限系统。

二 Django的RBAC

  描述 视图
django的RBAC

在传统的5表RBAC基础上,增加了一个关系表,用户与权限之间的关系表(user_permission)。

因为RBAC的本质是用户随着角色不同,而拥有不同的权限,而django的admin站点中,允许针对某一个用户,可以单独分配权限的。

 

二 后台运营admin站点

Django提供了一个基于项目model创建的一个后台管理站点admin。这个admin站点相当于一个在线版的数据库管理页面。在admin中我们管理我们创建的数据模型。

1 创建超级管理员

python manage.py createsuperuser

2 注册模型类

admin.py

from django.contrib import admin
from django.contrib import admin
from .models import Student, Course, Lecturer

admin.site.register(Student)
admin.site.register(Course)
admin.site.register(Lecturer)

module.py

from django.db import models


class Student(models.Model):
    """学生信息"""
    SEX_CHOICES = (
        (0, "女生"),
        (1, "男生"),
    )
    name = models.CharField(max_length=20, db_index=True, verbose_name="姓名", help_text='姓名')
    age = models.SmallIntegerField(verbose_name="年龄",help_text="年龄")
    avatar = models.ImageField(upload_to="avatar/%Y", null=True, blank=True, verbose_name="头像",help_text="头像")
    sex = models.SmallIntegerField(choices=SEX_CHOICES, default=0, verbose_name="性别",help_text="性别")
    classmate = models.CharField(db_column="class", max_length=5, db_index=True, verbose_name="班级",help_text="班级")
    description = models.TextField(blank=True, null=True, verbose_name="个性签名",help_text="个性签名")

    class Meta:
        db_table = "student"
        verbose_name = '学生信息表'
        verbose_name_plural = verbose_name

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.name


class Course(models.Model):
    name = models.CharField(db_column="course", max_length=50, unique=True, verbose_name="课程名称")
    lecturer = models.ForeignKey("Lecturer", db_constraint=False, related_name="course_list",
                                 on_delete=models.DO_NOTHING, verbose_name="授课老师")

    class Meta:
        db_table = "course"
        verbose_name = "课程信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Lecturer(models.Model):
    name = models.CharField(max_length=50, verbose_name="姓名")

    class Meta:
        db_table = "lecturer"
        verbose_name = "老师信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Achievement(models.Model):
    aid = models.BigAutoField(primary_key=True, verbose_name="ID")
    course = models.ForeignKey("Course", db_constraint=False, related_name="achievement_list", db_column="cid",
                               on_delete=models.DO_NOTHING, verbose_name="课程")
    student = models.ForeignKey("Student", db_constraint=False, related_name="achievement_list", db_column="sid",
                                on_delete=models.DO_NOTHING, verbose_name="学生")
    score = models.DecimalField(db_column="achievement", max_digits=4, decimal_places=2, verbose_name="分数")

    class Meta:
        db_table = "achievement"
        verbose_name = "成绩信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return str(self.__dict__)
models.py

数据迁移

python manage.py makemigrations
python manage.py migrate 

3 页面登录访问:http://127.0.0.1:8000/admin/

 

4 在admin中我们管理我们创建的数据模型。

 

标签:verbose,admin,db,django,RBAC,models,name
来源: https://www.cnblogs.com/daminghuahua/p/16560224.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有