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 相关文章推荐
pyqt5简介及安装方法介绍
Jan 31 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
利用python画出折线图
Jul 26 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
python对象与json相互转换的方法
May 07 Python
python 画二维、三维点之间的线段实现方法
Jul 07 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
python实现信号时域统计特征提取代码
Feb 26 Python
Python基于httpx模块实现发送请求
Jul 07 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
php封装的page分页类完整实例
2016/10/18 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
特色冷饮店创业计划书
2014/01/28 职场文书
补充协议书范本
2014/04/23 职场文书
建议书的格式
2014/05/12 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
数据设计之权限的实现
2022/08/05 MySQL