# -*- coding: utf-8 -*- # !/usr/bin/env python import logging import re from collections import OrderedDict from django.core.urlresolvers import RegexURLPattern, RegexURLResolver from apilib.utils_string import cn from apps.web.dealer.models import Dealer, PermissionRole from apps.web.utils import ErrorResponseRedirect from middlewares.django_jwt_session_auth import get_authorization_header from django.conf import settings as django_settings logger = logging.getLogger(__name__) class PermissionMiddleware(object): def process_request(self, request): auth_domain, _ = get_authorization_header(request) if auth_domain == django_settings.SERVICE_DOMAIN.DEALER: original_user = request.session.get('_auth_user_id') to_oper_user = request.session.get('oper_id') if original_user and to_oper_user: # role = PermissionRole.objects.filter(dealerId=to_oper_user, operId=original_user, isActive=True).first() permissionRule = PermissionRole.get_role_permission(dealerId=to_oper_user, operId=original_user) if not permissionRule: request.session.clear() return ErrorResponseRedirect(error=cn(u'您无权限进行此操作')) # TODO url 过滤 url = request.path # result = re.findall(r'password|pwd|verifyNewTel|Wallet|withdraw|paymentInfo|accountInfo', url, re.I) result = re.findall(r'password|pwd|verifyNewTel|getWalletWithdrawInfo', url, re.I) if result: return ErrorResponseRedirect(error=cn(u'您当前账号无权访问,请切换主账号来操作')) # 有授权信息 request.user = Dealer.objects.get(id=to_oper_user) request.permissions = permissionRule def process_response(self, request, response): return response def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict): """ 递归的去获取URL :param pre_namespace: namespace前缀,以后用户拼接name :param pre_url: url前缀,以后用于拼接url :param urlpatterns: 路由关系列表 :param url_ordered_dict: 用于保存递归中获取的所有路由 :return: """ for item in urlpatterns: if isinstance(item, RegexURLPattern): # 非路由分发 if not item.name: continue if pre_namespace: name = '%s:%s' % (pre_namespace, item.name) else: name = item.name url = pre_url + str(item._regex) url_ordered_dict[url.replace('^', '').replace('$', '')] = name elif isinstance(item, RegexURLResolver): if pre_namespace: if item.namespace: namespace = '%s:%s' % (pre_namespace, item.namespace) else: namespace = pre_namespace else: if item.namespace: namespace = item.namespace else: namespace = None recursion_urls(namespace, pre_url + str(item._regex), item.url_patterns, url_ordered_dict) def get_all_url_dict(): """ 获取项目中所有的URL :return: """ url_ordered_dict = OrderedDict() import urls as md recursion_urls(None, '/', [md.urlpatterns[6]], url_ordered_dict) # 递归去获取所有的路由 for key, val in url_ordered_dict.items(): print '\33[33m' + key + '\t\t\t' + val + '\33[0m'