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中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
Python写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
python中执行shell的两种方法总结
Jan 10 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
Python实现的端口扫描功能示例
Apr 08 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
Jun 09 Python
将数据集制作成VOC数据集格式的实例
Feb 17 Python
Python unittest框架操作实例解析
Apr 13 Python
通俗讲解python 装饰器
Sep 07 Python
pytorch实现ResNet结构的实例代码
May 17 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
JavaScript 继承详解(二)
2009/07/13 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
如何使用python代码操作git代码
2020/02/29 Python
python 写一个文件分发小程序
2020/12/05 Python
物理教学随笔感言
2014/02/22 职场文书
综艺节目策划方案
2014/06/13 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
一年级下册数学教学反思
2016/02/16 职场文书