smking.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # coding:utf-8
  2. from rest_framework.permissions import BasePermission
  3. from django.contrib.sessions.models import Session
  4. from django.utils import timezone
  5. from smartfarming.models.user import DeviceUser
  6. from kedong.utils import PrAes
  7. class LoginPermission(BasePermission):
  8. def has_permission(self, request, view):
  9. token = request.data.get("token", "")
  10. if not token:
  11. return False
  12. try:
  13. ip = request.META['HTTP_X_FORWARDED_FOR']
  14. except Exception as e:
  15. ip = request.META['REMOTE_ADDR']
  16. if '%2B' in token or " " in token:
  17. token = str(token).replace("%2B", "+").replace(" ", "+")
  18. try:
  19. session_key = PrAes.aesdecrypt(token)
  20. sessions_obj = Session.objects.get(session_key=session_key)
  21. expired_time = sessions_obj.expire_date
  22. if timezone.now() >= expired_time:
  23. raise Exception()
  24. sessions = sessions_obj.get_decoded()
  25. try:
  26. value = sessions.get('user_id')
  27. uid = int(value)
  28. state = 1
  29. try:
  30. auto_login_uid = int(sessions.get('auto_login_uid'))
  31. temp_state = auto_login_uid - uid
  32. if temp_state in [1, 4]:
  33. state = temp_state
  34. except Exception as e:
  35. pass
  36. device_user = DeviceUser.objects.get(uid=uid, state=state)
  37. request.myuser = device_user
  38. request.ip = ip
  39. try:
  40. perm = device_user.perm(uid)
  41. request.user_perm = perm
  42. request.role_id = device_user.role_id
  43. request.user_type = device_user.user_type
  44. except Exception:
  45. request.user_perm = None
  46. request.role_id = None
  47. pass
  48. except Exception:
  49. request.myuser = None
  50. request.user_perm = None
  51. request.role_id = None
  52. return False
  53. except Exception as e:
  54. return False
  55. return True