Django權限管理系統設計分析

權限管理顧名思義,其實就是角色控制權限的系統,每一個用戶對應一個角色,每一個角色有對應的權限,好比公司會有CEO,總監,銷售經理,銷售員,每一個人的權限都不同,那咱們給他展現的url也都不一樣css

1、首先建立項目,再建立一個名爲rbac的app

  修改配置文件settings,將css以及js、img等放到static文件夾下python

2、表結構設計

 設計表:正則表達式

  建立五個類,七張表:django

  菜單表,權限組,權限表,用戶表,角色表,session

  角色表和權限表是多對多的關係(一個角色能夠有多個權限,一個權限能夠對應多個角色)
     用戶表和角色表是多對多的關係(一個用戶能夠有多個角色,一個角色有多個用戶)app

  

 

models.pyurl

from django.db import models


# 菜單組
    class Menu(models.Model):
    title = models.CharField(verbose_name='菜單組', max_length=32)

    class Meta:
        verbose_name_plural = '菜單表'

    def __str__(self):
        return self.title


# 權限組
class Group(models.Model):
    title = models.CharField(verbose_name='權限標題', max_length=32)
    menu = models.ForeignKey(verbose_name='所屬菜單', to='Menu', default=1)

    class Meta:
        verbose_name_plural= '權限組表'

    def __str__(self):
        return self.title


# 權限表
class Permission(models.Model):

    title = models.CharField(verbose_name='標題', max_length=128)
    url = models.CharField(verbose_name='含正則表達式的URL', max_length=128)
    menu_gp = models.ForeignKey(verbose_name='組內權限', to='Permission', null=True, blank=True, related_name='x1')
    code = models.CharField(verbose_name='權限代號', max_length=32)
    group = models.ForeignKey(verbose_name='所屬組', to='Group')

    class Meta:
        verbose_name_plural= '權限表'

    def __str__(self):
        return self.title

# 用戶表
class UserInfo(models.Model):

    username = models.CharField(verbose_name='用戶名', max_length=32)
    password = models.CharField(verbose_name='密碼',max_length=64)
    user_role = models.ManyToManyField(verbose_name='用戶角色', to='Role', blank=True)

    class Meta:
        verbose_name_plural= '用戶表'

    def __str__(self):
        return self.username

# 角色表
class Role(models.Model):

    position = models.CharField(verbose_name='職位', max_length=32)
    permissions = models.ManyToManyField(verbose_name='角色權限', to='Permission', blank=True)

    class Meta:
        verbose_name_plural= '角色表'

    def __str__(self):
        return self.position

 

咱們通常是先看到的是列表頁面,在這個頁面上是否顯示添加,是否顯示編輯,是否顯示刪除,都是須要判斷的, 有無添加權限,有無刪除權限,有無編輯權限,咱們能夠給每個url一個代號,將代號取出來放在一個列表裏面設計

dict = {
	'5': {
		'codes': ['list', 'add', 'edit', 'del'],
		'urls': ['/userinfo/', '/userinfo/add/', '/userinfo/(\\d+)/change/', '/userinfo/(\\d+)/delete/']
	},
	'1': {
		'codes': ['list', 'add', 'edit', 'del'],
		'urls': ['/order/', '/order/add/', '/order/(\\d+)/change/', '/order/(\\d+)/delete/']
	}
}

把這個字典存到session中當你訪問頁面的時候我就知道你有什麼權限一個url對應一個code 多個url對應一個組.code

3、經過Django-admin錄入數據

先建立一個超級用戶:python3 manage.py createsuperuser
用戶名:root
密碼:a123456中間件

 在admin.py中作以下配置:

from django.contrib import admin
from . import models

admin.site.register(models.Menu)
admin.site.register(models.UserInfo)
admin.site.register(models.Role)
admin.site.register(models.Permission)
admin.site.register(models.Group)

 

models.py中作以下配置,就能夠在添加的時候顯示中文了。

# 菜單組
class Menu(models.Model):
    title = models.CharField(verbose_name='菜單組', max_length=32)

    class Meta:
        verbose_name_plural = '菜單表'

    def __str__(self):
        return self.title

  

 

 

 

 4、編寫登陸

  利用Django的中間件進行控制,沒有登陸的用戶不能直接訪問內部的url,並且只能訪問admin,login,index這三個url,將其設置爲白名單,用戶登陸成功後,將用戶信息方法哦session裏邊,進行權限訪問時去session裏邊讀取,若是有的話進行url跳轉,若是沒有的話返回‘’無權訪問‘’

   1.在settings內設置白名單:

    

  2.編寫中間件控制時,必須繼承MiddlewareMixin這個類

   

# -*- coding:utf-8 -*-
# !/usr/bin/python
from django.shortcuts import redirect, HttpResponse
from django.conf import settings
import re

class MiddlewareMixin(object):

    def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        if not response:
            response = self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response


class RbacMiddleware(MiddlewareMixin):

    def process_request(self, request):

        # 1.當前請求的URL
        current_request_url = request.path_info

        # 2.處理白名單
        for url in settings.VALID_URL_LIST:
            if re.match(url, current_request_url):
                return None

        # 3.獲取session中保存的權限信息
        permission_dict = request.session.get(settings.XX)
        print(permission_dict)
        if not permission_dict:
            return redirect(settings.RBAC_LOGIN_URL)
        flag = False
        for group_id, values in permission_dict.items():
            for url in values["urls"]:
                if re.match(url, current_request_url):
                    flag = True
                    break
            if flag:
                break
        if not flag:
            return HttpResponse("無權訪問")
相關文章
相關標籤/搜索