validPermission.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. import re
  5. from collections import OrderedDict
  6. from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
  7. from apilib.utils_string import cn
  8. from apps.web.dealer.models import Dealer, PermissionRole
  9. from apps.web.utils import ErrorResponseRedirect
  10. from middlewares.django_jwt_session_auth import get_authorization_header
  11. from django.conf import settings as django_settings
  12. logger = logging.getLogger(__name__)
  13. class PermissionMiddleware(object):
  14. def process_request(self, request):
  15. auth_domain, _ = get_authorization_header(request)
  16. if auth_domain == django_settings.SERVICE_DOMAIN.DEALER:
  17. original_user = request.session.get('_auth_user_id')
  18. to_oper_user = request.session.get('oper_id')
  19. if original_user and to_oper_user:
  20. # role = PermissionRole.objects.filter(dealerId=to_oper_user, operId=original_user, isActive=True).first()
  21. permissionRule = PermissionRole.get_role_permission(dealerId=to_oper_user, operId=original_user)
  22. if not permissionRule:
  23. request.session.clear()
  24. return ErrorResponseRedirect(error=cn(u'您无权限进行此操作'))
  25. # TODO url 过滤
  26. url = request.path
  27. # result = re.findall(r'password|pwd|verifyNewTel|Wallet|withdraw|paymentInfo|accountInfo', url, re.I)
  28. result = re.findall(r'password|pwd|verifyNewTel|getWalletWithdrawInfo', url, re.I)
  29. if result:
  30. return ErrorResponseRedirect(error=cn(u'您当前账号无权访问,请切换主账号来操作'))
  31. # 有授权信息
  32. request.user = Dealer.objects.get(id=to_oper_user)
  33. request.permissions = permissionRule
  34. def process_response(self, request, response):
  35. return response
  36. def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
  37. """
  38. 递归的去获取URL
  39. :param pre_namespace: namespace前缀,以后用户拼接name
  40. :param pre_url: url前缀,以后用于拼接url
  41. :param urlpatterns: 路由关系列表
  42. :param url_ordered_dict: 用于保存递归中获取的所有路由
  43. :return:
  44. """
  45. for item in urlpatterns:
  46. if isinstance(item, RegexURLPattern): # 非路由分发
  47. if not item.name:
  48. continue
  49. if pre_namespace:
  50. name = '%s:%s' % (pre_namespace, item.name)
  51. else:
  52. name = item.name
  53. url = pre_url + str(item._regex)
  54. url_ordered_dict[url.replace('^', '').replace('$', '')] = name
  55. elif isinstance(item, RegexURLResolver):
  56. if pre_namespace:
  57. if item.namespace:
  58. namespace = '%s:%s' % (pre_namespace, item.namespace)
  59. else:
  60. namespace = pre_namespace
  61. else:
  62. if item.namespace:
  63. namespace = item.namespace
  64. else:
  65. namespace = None
  66. recursion_urls(namespace, pre_url + str(item._regex), item.url_patterns, url_ordered_dict)
  67. def get_all_url_dict():
  68. """
  69. 获取项目中所有的URL
  70. :return:
  71. """
  72. url_ordered_dict = OrderedDict()
  73. import urls as md
  74. recursion_urls(None, '/', [md.urlpatterns[6]], url_ordered_dict) # 递归去获取所有的路由
  75. for key, val in url_ordered_dict.items():
  76. print '\33[33m' + key + '\t\t\t' + val + '\33[0m'