validPermission.py 3.2 KB

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