cauth.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #coding=utf-8
  2. import logging
  3. import datetime
  4. import account.password_handle as ph
  5. from django.db.models import Q
  6. import common.error_info as ctc
  7. import common.models as am
  8. import account.lock_account as la
  9. logger = logging.getLogger(__name__)
  10. class AccountManage(object):
  11. def authenticate(self,request,account,pwd):
  12. """
  13. @attention: 用户认证
  14. """
  15. #临时收到解锁ip
  16. if pwd=="clear_ip_{}".format(account) :
  17. la.clear_lock(0,request.ip)
  18. if la.is_lock_ip(request.ip):
  19. raise ctc.TipException(u'密码连续输错20次,锁定ip半个小时!')
  20. user = am.UserInfo.objects.filter(Q(name=account)).first()
  21. if user is not None:
  22. #临时收到解锁ip
  23. if pwd=="clear_account_{}".format(account) :
  24. la.clear_lock(user.id,0)
  25. if self.user_can_authenticate(user):
  26. if la.is_lock(user.id, request.ip)=="ip_lock":
  27. raise ctc.TipException(u'密码连续输错20次,锁定ip半个小时!')
  28. if la.is_lock(user.id, request.ip)=="account_lock":
  29. #记录ip错误
  30. la.increase_error_count_ip(request.ip)
  31. raise ctc.TipException(u'密码连续输错5次,锁定用户10分钟!')
  32. if ph.check_password(pwd, user.password):
  33. la.clear_lock_count(user.id, request.ip)
  34. return user
  35. else:
  36. logger.info("account, pwd %s", 'login failed')
  37. #记录ip错误
  38. la.increase_error_count_ip(request.ip)
  39. #记录用户名错误
  40. la.increase_error_count_uid(user.id)
  41. raise ctc.TipException("账号或密码错误")
  42. else:
  43. raise ctc.TipException("账户已停用")
  44. else:
  45. #记录ip错误
  46. la.increase_error_count_ip(request.ip)
  47. raise ctc.TipException("账号或密码错误")
  48. def user_can_authenticate(self, user):
  49. """
  50. @attention: 账户是否已经激活
  51. """
  52. # end_date = getattr(user, 'expiry_date', '')
  53. # now = datetime.datetime.now().strftime("%Y%m%d")
  54. # if end_date < now:
  55. # return False
  56. is_active = getattr(user, 'is_active', None)
  57. return is_active == '1'
  58. # --------------- 这部分是django的session系统需要的部分,必须存在,没太大作用 ------------
  59. def get_user(self, pk):
  60. """
  61. @attention: 由于在django系统中,每次request都是一个独立的请求,所以每次进入时第一次使用,都会调用该函数
  62. """
  63. try:
  64. user = am.UserInfo.objects.get(pk=pk)
  65. except am.UserInfo.DoesNotExist:
  66. return None
  67. return user