Django web框架之权限管理二
发布日期:2021-08-13 22:07:55 浏览次数:7 分类:技术文章

本文共 6171 字,大约阅读时间需要 20 分钟。

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 settingsdef 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 refrom django.conf import settingsfrom django.shortcuts import redirect,render,HttpResponseclass 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 refrom django.conf import settingsfrom django.template import Libraryregister = 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}

  

  

  

 

  

转载于:https://www.cnblogs.com/supery007/p/7825696.html

转载地址:https://blog.csdn.net/weixin_30699831/article/details/98338420 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:[设计模式] javascript 之 享元模式;
下一篇:使用bat文件实现批量重命名功能

发表评论

最新留言

不错!
[***.144.177.141]2024年04月14日 20时40分58秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章