Django 自定义权限管理系统详解(通过中间件认证)


Posted in Python onMarch 11, 2020

1. 创建工程文件, 修改setting.py文件

django-admin.py startproject project_name

特别是在 windows 上,如果报错,尝试用 django-admin 代替 django-admin.py 试试

setting.py 最终的配置文件

import os
import sys
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,os.path.join(BASE_DIR,"apps"))
 
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/
 
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '!g%gzw+-t8*+c2irzcm=r_#*x$q^(x-(^prn7wpnph3w#j$1gl'
 
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
 
 
# Application definition
INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'apps.system',
]
 
MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  # 'django.middleware.csrf.CsrfViewMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
   'libs.middleware.permission.permissionMiddleware'
]
 
ROOT_URLCONF = 'iFactory.urls'
 
TEMPLATES = [
  {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
      'context_processors': [
        'django.template.context_processors.debug',
        'django.template.context_processors.request',
        'django.contrib.auth.context_processors.auth',
        'django.contrib.messages.context_processors.messages',
      ],
    },
  },
]
 
WSGI_APPLICATION = 'iFactory.wsgi.application'
 
 
# Database
# https://docs.djangoproject.com/en/dev/ref/settings/#databases
DATABASES = {
  'default': {
     'ENGINE': 'django.db.backends.postgresql_psycopg2',
     'NAME': "iFactory",
     'USER': "postgres",
     'PASSWORD': "postgres",
     'HOST': "127.0.0.1",
     'PORT': "5432",
     'CONN_MAX_AGE': 5,
  }
}
 
 
# Password validation
# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
  {
    'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  },
  {
    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
  },
  {
    'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  },
  {
    'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  },
]
 
 
# Internationalization
# https://docs.djangoproject.com/en/dev/topics/i18n/
LANGUAGE_CODE = 'zh_Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
 
 
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/dev/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
 
# Session setting
SESSION_COOKIE_AGE = 30 * 60
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
 
# session_permisson_key
SESSION_PERMISSION_URL_KEY = "perUrl"
SESSION_MENU_KEY = "menu"
MENU_ALL = "menuAll"
MENU_PERMISSON = "menuPer"
 
# permisson
LOGIN_URL = '/login/'
REGEX_URL = r'^{url}$' # url作严格匹配
SAFE_URL = [
  '/login/',
]

2. 根目录创建apps文件夹(python包文件夹),创建应用system, 把应用放入到apps文件夹中

python manage.py startapp system, 在setting中的INSTALLED_APPS中添加对应的app

最终的目录结构

Django 自定义权限管理系统详解(通过中间件认证)

3. 修改system/model.py 文件

#-*-coding:utf-8-*-
from django.db import models
 
# Create your models here.
class Menu(models.Model):
  '''
  菜单
  '''
  title = models.CharField(max_length=32, unique=True)
  parent = models.ForeignKey("Menu", null=True, blank=True)
 
  def __str__(self):
    # 显示层级菜单
    title_list = [self.title]
    p = self.parent
    while p:
      title_list.insert(0, p.title)
      p = p.parent
    return '-'.join(title_list)
 
class Permission(models.Model):
  '''
  权限
  '''
  title = models.CharField(max_length=32, unique=True)
  url = models.CharField(max_length=128, unique=True)
  menu = models.ForeignKey("Menu", null=True, blank=True)
  # 定义菜单间的自引用关系
  # 权限url 在 菜单下;菜单可以有父级菜单;还要支持用户创建菜单,因此需要定义parent字段(parent_id)
  # blank=True 意味着在后台管理中填写可以为空,根菜单没有父级菜单
 
  def __str__(self):
    # 显示带菜单前缀的权限
    return '{menu}---{permission}'.format(menu=self.menu, permission=self.title)
 
class Role(models.Model):
  '''
  角色:绑定权限
  '''
  title = models.CharField(max_length=32, unique=True)
  # 定义角色和权限的多对多关系
  permissions = models.ManyToManyField("Permission")
 
  def __str__(self):
    return self.title
class User(models.Model):
  '''
  用户 -- 角色划分
  '''
  username = models.CharField(max_length=32)
  password = models.CharField(max_length=32)
  phone = models.CharField(max_length=11)
  email = models.EmailField()
  is_admin = models.BooleanField(default=False)
  is_push_email = models.BooleanField(default=True)
  is_push_phone = models.BooleanField(default=True)
  # create_datetime = models.DateTimeField(auto_now_add=True)
  # 定义用户和角色的多对多关系
  roles = models.ManyToManyField("Role")
 
  def __str__(self):
    return '{username}---{phone}' \
        ''.format(username=self.username, phone=self.phone)

4. 数据库迁移

执行 python manage.py makemigrations system

执行python manage.py migrate system

Django 自定义权限管理系统详解(通过中间件认证)

5. 建立userService.py文件(文件位置看上图目录),代码如下:

from ..models import Menu
 
def init_user_permission(request, user):
  '''
  查询出用户的所有权限,进行分类写入session进行保存
  :param request:
  :param user:
  :return:
  '''
  # 查询出用户的所有权限
  permisson_item_list = user.roles.values('permissons__title',
                      'permissons__url',
                      'permissons__menu_id'
                      ).distinct()
  permisson_url_list = []
  permisson_menu_list = []
  all_menu_list = list(Menu.objects.values("id", "title", "parent_id"))
  for permission_item in permisson_item_list:
    permisson_url_list.append(permission_item["permissons__url"])
    if permission_item["permissons__menu__id"]:
      temp = {
        "title": permission_item["permissons__title"],
        "url": permission_item["permissons__url"],
        "menu_id": permission_item["permissons__menu_id"]
      }
      permisson_menu_list.append(temp)
  # 写入session
  from django.conf import settings
  request.session[settings.SESSION_PERMISSION_URL_KEY] = permisson_url_list
  request.session[settings.SESSION_MENU_KEY] = {
    settings.MENU_ALL: all_menu_list,
    settings.MENU_PERMISSON: permisson_menu_list,
  }

6. 建立views_user.py 文件:

#-*-coding:utf-8-*-
from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
from apps.system.services import userService
from apps.system.models import User
 
def user_login(request):
  '''
  用户登录
  :param request:
  :return:
  '''
  if request.method == "GET":
    return render(request, "login.html")
  else:
    res = {}
    username = request.POST.get("username")
    password = request.POST.get("password")
    user = User.objects.filter(username=username, password=password).first()
    if not user:
      res["status"]= "false"
    else:
      userService.init_user_permission(request, user)
    return JsonResponse(res)

注意: 以上的setting.py 增加的配置:

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  # 'django.middleware.csrf.CsrfViewMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
   'libs.middleware.permission.permissionMiddleware'
]
# Session setting
SESSION_COOKIE_AGE = 30 * 60
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
 
# session_permisson_key
SESSION_PERMISSION_URL_KEY = "perUrl"
SESSION_MENU_KEY = "menu"
MENU_ALL = "menuAll"
MENU_PERMISSON = "menuPer"
 
# permisson
LOGIN_URL = '/login/'
REGEX_URL = r'^{url}$' # url作严格匹配
SAFE_URL = [
  '/login/',
]

以上这篇Django 自定义权限管理系统详解(通过中间件认证)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现折半查找和归并排序算法
Apr 14 Python
Django数据库连接丢失问题的解决方法
Dec 29 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
python argparser的具体使用
Nov 10 Python
jupyter notebook的安装与使用详解
May 18 Python
python调用私有属性的方法总结
Jul 24 Python
python获取命令行参数实例方法讲解
Nov 02 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 03 Python
python 实现客户端与服务端的通信
Dec 23 Python
Django如何重置migration的几种情景
Feb 24 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
如何利用Python实现一个论文降重工具
Jul 09 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 #Python
pygame实现飞机大战
Mar 11 #Python
Django框架models使用group by详解
Mar 11 #Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 #Python
python 链接sqlserver 写接口实例
Mar 11 #Python
浅谈Python中range与Numpy中arange的比较
Mar 11 #Python
python读取当前目录下的CSV文件数据
Mar 11 #Python
You might like
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
增强的 JavaScript 的 trim 函数的代码
2007/08/13 Javascript
JavaScript的Cookies
2008/01/16 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
js的2种继承方式详解
2014/03/04 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
Python实现针对中文排序的方法
2017/05/09 Python
python嵌套字典比较值与取值的实现示例
2017/11/03 Python
Python 统计字数的思路详解
2018/05/08 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python之变量类型和if判断方式
2020/05/05 Python
如何通过命令行进入python
2020/07/06 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
海量信息软件测试笔试题
2015/08/08 面试题
优良学风班申请材料
2014/02/13 职场文书
工商行政处罚决定书
2015/06/24 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
Python基本的内置数据类型及使用方法
2022/04/13 Python