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生成日历实例解析
Aug 21 Python
Python去除列表中重复元素的方法
Mar 20 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
python分析网页上所有超链接的方法
May 08 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
pyinstaller还原python代码过程图解
Jan 08 Python
使用python实现多维数据降维操作
Feb 24 Python
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
May 27 Python
Python函数对象与闭包函数
Apr 13 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
php生成动态验证码gif图片
2015/10/19 PHP
学习YUI.Ext 第七天--关于View&JSONView
2007/03/10 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
javascript实现数独解法
2015/03/14 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
python中@contextmanager实例用法
2021/02/07 Python
联想德国官网:Lenovo Germany
2018/07/04 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
大学生毕业自荐信
2013/10/10 职场文书
售后专员岗位职责
2013/12/08 职场文书
护理专业学生的求职信范文
2013/12/11 职场文书
年会活动策划方案
2014/01/23 职场文书
公司授权委托书
2014/04/04 职场文书
2015感人爱情寄语
2015/02/26 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
母亲节感言
2015/08/03 职场文书
各国货币符号大全
2022/02/17 杂记