Django web框架之权限管理二

1. login登录

def login(request):
    if request.method=="GET":
        return render(request,‘login.html‘)
    else:
        username=request.POST.get(‘user‘)
        password=request.POST.get(‘pwd‘)
        user=models.User.objects.filter(username=username,password=password).first()
        if user:
            init_permission(user,request)
            return redirect(‘/index/‘)
        else:
            return redirect(‘/login/‘)

2. init_permission(user,request)定制Session

from django.conf import settings

def init_permission(user,request):  # 取数据
    permission_list = user.roles.values(
        ‘permission__id‘,
        ‘permission__title‘,
        ‘permission__url‘,
        ‘permission__code‘,
        ‘permission__menu_group‘,
        ‘permission__group_id‘,
        ‘permission__group__caption‘,
        ‘permission__group__menu_id‘,
        ‘permission__group__menu__title‘,
    ).distinct()
    current_url = request.path_info

    # 过滤权限相关的
    result = {}

    # 用户所有的操作代码和可访问的url地址——权限相关
    for item in permission_list:
        group_id=item[‘permission__group_id‘]
        code = item[‘permission__code‘]
        url=item[‘permission__url‘]
        if group_id in result:
            result[group_id][‘codes‘].append(code)
            result[group_id][‘urls‘].append(url)
        else:
            result[group_id]={
                ‘codes‘:[code,],
                ‘urls‘:[url,],
            }
   # Session中添加字典
    request.session[settings.PERMISSION_URL_DICT_KEY] = result

    # 过滤菜单相关的
    menu_list = []

    for item in permission_list:
        msg = {
            ‘id‘: item[‘permission__id‘],
            ‘title‘: item[‘permission__title‘],
            ‘url‘: item[‘permission__url‘],
            ‘menu_gp_id‘: item[‘permission__menu_group‘],
            ‘menu_id‘: item[‘permission__group__menu_id‘],
            ‘menu_title‘: item[‘permission__group__menu__title‘],
        }
        menu_list.append(msg)
   # Session中添加字典 
    request.session[settings.PERMISSION_MENU_KEY]=menu_list

3. setting配置

PERMISSION_URL_DICT_KEY=‘permission_url_dict‘   # 权限url数据
PERMISSION_MENU_KEY=‘permission_menu_dict‘      # 菜单字典数据

4. 创建中间件

路径:E:\permission80\rbac\middleware\rbac.py  

import re
from django.conf import settings
from django.shortcuts import redirect,render,HttpResponse

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
# 继承父类MiddlewareMixin方法
class RbacMiddleware(MiddlewareMixin):
    def process_request(self,request):
        current_url=request.path_info  # 取到用户方法的路径信息:譬如 /index/,/userinfo/
     # 判断用户访问的路径是否在白名单中
        for url in settings.VALID_URL:
            regax="^{0}$".format(url)       # 如果匹配成功停止匹配,None继续往后面执行其他中间件,如果没有则直接到url路由规则中匹配,(/index/ ,views.index)
            if re.match(regax,current_url):
                return None
     # 从Session中取到权限数据,用户权限下的路径
        permission_dict=request.session.get(settings.PERMISSION_URL_DICT_KEY)     # 如果没有则跳转到登录路径
        if not permission_dict:
            return redirect(‘/login/‘)

        flag=False
        for group_id,code_url_dic in permission_dict.items():

            for db_url in code_url_dic[‘urls‘]:
                regax="^{0}$".format(db_url)          # 匹配当前用户权限的路径是哪一个路径
                if re.match(regax,current_url):            # 给request中添加一个字典,values对应用户访问的权限下的codes代码:譬如 add  list edit
                    request.permission_code_list=code_url_dic[‘codes‘]
                    flag=True
                    break
            if flag:
                break
        if not flag:
            return HttpResponse(‘无权访问‘)

5. setting配置中间件

# 白名单
VALID_URL=[
    ‘/login/‘,
    ‘/logoff/‘,
    ‘/index/‘,
    ‘/test/‘,
    ‘/admin.*‘,
]

# 加入中间件列表中
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‘,
    ‘rbac.middleware.rbac.RbacMiddleware‘,
]

6. 自定义模板

路径:E:\permission80\rbac\templatetags\rbactag.py

a. 首先创建模板目录templatetags,名称必须一样

import re

from django.conf import settings
from django.template import Library

register = Library()

# 引用html文件tag.html
@register.inclusion_tag(‘tag.html‘)
def menu_html(request):
    # 通过request取到定制session中的菜单数据
    permission_menu = request.session[settings.PERMISSION_MENU_KEY]
    current_url = request.path_info
    menu_dict = {}
    for item in permission_menu:
       # 判断组内菜单是否在menu_dict中
        if not item[‘menu_gp_id‘]:
            menu_dict[item[‘menu_id‘]] = item

    for item in permission_menu:
        regax = "^{0}$".format(item[‘url‘])
       # 匹配用户访问的路径是menu_dict中哪一个,给访问的路径添加一条actvie活动匹配
        if re.match(regax, current_url):
            menu_gp_id = item[‘menu_id‘]
            if menu_gp_id:
               # 菜单组添加active
                menu_dict[menu_gp_id][‘active‘] = True
            else:
                # 组内菜单列表添加
                menu_dict[item[‘id‘]][‘active‘] = True

    result = {}
    for item in menu_dict.values():
        active = item.get(‘active‘)
        menu_id = item[‘menu_id‘]
        if menu_id in result:
            result[menu_id][‘children‘].append({‘title‘: item[‘title‘], ‘url‘: item[‘url‘], ‘active‘: active})
            if active:
                result[menu_id][‘active‘] = True
        else:
            result[menu_id] = {
                ‘menu_id‘: item[‘menu_id‘],
                ‘menu_title‘: item[‘menu_title‘],
                ‘active‘: active,
                ‘children‘: [
                    {‘title‘: item[‘title‘], ‘url‘: item[‘url‘], ‘active‘: active}
                ]
            }

    return {‘menu_dict‘: result}

  

  

  

 

  

时间: 2024-10-09 07:56:57

Django web框架之权限管理二的相关文章

JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

shiro介绍 什么是shiro shiro是Apache的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架.它可以实现如下的功能: 1.验证用户 2.对用户执行访问控制,如:判断用户是否具有角色admin,判断用户是否拥有访问的资源权限. 3.在任何环境下使用SessionAPI.例如C/S程序 4.可以使用多个用户数据源.例如一个是Oracle数据库,另外一个是MySQL数据库. 5.单点登录(SSO)功能

Linux(CentOS7)系统中部署Django web框架

1. 概述 部署django和vue架在逻辑上可以分为web层与数据库层:web前端通过实现了WSGI协议的模块对python代码进行解析,而python代码中则通过特定于数据库的操作接口对数据库进行读取与写入. Django自身内置了轻量级的web服务器与sqlite数据库,可以用于简单的代码测试,并支持Apache httpd与Nginx作为web前端,以及PostgreSQL/MySQL/Oracle等数据库作为后端存储,用于实际的生产环境. 本文分别以MySQL + Apache htt

01 Django web框架的原理

Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"O

Django web框架 下载安装 简单项目搭建

什么是web应用? Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件 应用程序有两种模式C/S.B/S.C/S是客户端/服务器端程序,也就是说这类程序一般独立运行.而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行.WEB应用程序一般是B/S模式.Web应用程序首先是“应用程序”,和用标准的程序语言,如C.C++等编写出来的程序没有什么本质上的不同.然而Web应用程序又有自己独特的地

django 自定义user使用权限管理模块

这篇文章主要是讲如何让自定义的user模块也能用到django.contrib.auth中的权限管理模块 看这篇文章之前请先看一下我前边的两篇文章,本文以这两篇文章为基础: django 自定义 USER 用源码告诉你django权限管理是怎么回事 下边是一个大概的实现,后边再做详细分析: 1.user model自定义 class AbstractUser(models.Model): # 登录信息 id = models.AutoField(primary_key=True) staff =

Django—内置用户权限管理

内置用户权限管理 对于注册.登录.验证等功能我们可以自己编写用户管理应用,但Django也有一个内置的用户权限管理系统.也是很强大的. 在哪可以看到? 关于用户的信息都存放在这个表中. auth模块 from django.contrib import auth 其中有几个常用的方法: authenticate() 提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username .password两个关键字参数. 如果认证成功(用户名和密码正确有效),便会返回一个 User 实例对象

SQL Server与Oracle对比学习:权限管理(二) 一些有趣的比喻

http://blog.csdn.net/weiwenhp/article/details/8094739 目录(?)[-] SQL Server权限管理 login 与user的区别 角色role 赋予权限 用比喻来对比Oracle 与SQL Server Oracle的世界 SQL Server的世界 SQL Server权限管理 login 与user的区别 我玩惯了Oracle刚一来玩SQL Server就被login 和user这样的概念搞的有点迷糊了.因为Oracle中没有这样的区分

Django Web框架本质

一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1. 半成品自定义web框架 import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b

接口测试随笔四之根据Django web框架进行接口测试

Django快速开发之投票系统 之前分享过一篇Django开发投票系统的例子.今天在这个例子上做一些延伸,来讲讲web接口的开发与测试. 开发投票系统接口                                                      虽然投票系统的的功能已经开发完成,但我们并没有开发专门的接口,在当前的投票系统中,在我们调用一个get或post请求时,系统会返回整个页面,并且把测试连同页面一起返回. 例如,当我们要调用所有问题的接口时(test_get.py) imp