Django之自定义用户权限(自定义RBAC组件)

RBAC组件

rbac 组件一般我们用于权限的校验,帮助我们更好的管理用户认证信息,不同的用户权限不同,访问的界面展示也不相同

什么是权限: 一个含有正则表达式的 url

基于 RBAC 设计表关系:
Django之自定义用户权限(自定义RBAC组件)_第1张图片

class User(models.Model):
    class Meta:
        # 此处设置 admin 中显示名称
        verbose_name = verbose_name_plural = '用户表'

    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    roles = models.ManyToManyField(to='Role')

    def __str__(self):
        return self.name


class Role(models.Model):
    class Meta:
        verbose_name = verbose_name_plural = '职位表'

    title = models.CharField(max_length=32)
    permissions = models.ManyToManyField(to='Permission')

    def __str__(self):
        return self.title


class Permission(models.Model):
    class Meta:
        verbose_name = verbose_name_plural = '权限表'

    title = models.CharField(max_length=32)
    url = models.CharField(max_length=32)
	menu=models.ForeignKey("Menu",on_delete=models.CASCADE,null=True)
    
    def __str__(self):
        return self.title
    
    
class Menu(models.Model):
    class Meta:
        verbose_name = verbose_name_plural = '菜单表'
        
    title = models.CharField(max_length=32, verbose_name='菜单')
    icon = models.CharField(max_length=32, verbose_name='图标', null=True, blank=True)


添加需要的权限信息

任何利用中间件和自定义的模块 传输和获取 当前用户的权限信息

# 通过自定义 middleware 模块在 setting 中加入,引入中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
import re


class PermissionMiddleWare(MiddlewareMixin):

    def process_request(self, request):

        current_path = request.path
        # 设置白名单
        for reg in ['/login/', '/admin/*']:
            ret = re.search(reg, current_path)
            if ret:
                return None

        # 校验是否登录
        user_id = request.session.get('user_id')
        if not user_id:
            return redirect('/login/')

        # 校验权限
        permission_list = request.session.get("permission_list")
        for reg in permission_list:
            reg = "^%s$" % reg
            ret = re.search(reg, current_path)
            if ret:
                return None

        return HttpResponse("无权访问!")

rbac 自定义模块

from app1.models import *


def initial_sesson(user, request):
    """
    功能:将当前登录人的所有权限录入 session 中
    :param user:当前登录人
    :param request:
    :return:
    """
    # 查询当前登录人的所有权限列表
    permissions = Role.objects.filter(user=user).values('permissions__url')
    print('roles', permissions)

    permissions_list = []
    for item in permissions:
        permissions_list.append(item['permissions__url'])

    # 将当前登录人的权限列表注入 session 中
    request.session['permission_list'] = permissions_list

Django之自定义用户权限(自定义RBAC组件)_第2张图片

动态显示菜单权限

动态获取显示菜单,注意本次显示是后台操作

需要获取当前用户的权限信息,获取 url 和 是否为菜单,以及所带的 icon 图标。因为设计到传值的问题,于是我们产生了自定过滤器。

首先自定过滤器

# web.py 文件中
from django.utils.safestring import mark_safe
from django.template import Library
import re
register =Library()


@register.inclusion_tag("rbac/menu.html")
# 将当前函数的 permission_menu_dict 传给 rbac 的 menu.html
def get_menu_styles(request):
    """
    自定义过滤器
    :param request:传入当前用户菜单信息 
    :return: 
    """
    permission_menu_dict = request.session.get("permission_menu_dict")
    print("permission_menu_dict",permission_menu_dict)
    return {"permission_menu_dict":permission_menu_dict}

在 menu.html 中书写

# menu.html
{% for item in permission_menu_dict.values %}
{{ item.menu_title }}
{% for foo in item.children %} {{ foo.title }} {% endfor %}
{% endfor %}

使用自定义的组件

 <div class="left-menu">
      <div class="menu-body">
           {% load web %}
           {% get_menu_styles request %}
      div>
div>

整体样图

Django之自定义用户权限(自定义RBAC组件)_第3张图片

你可能感兴趣的:(Django,框架)