gooderp18绿色标准版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 line
2.9KB

  1. ##########################################################################
  2. #
  3. # pgAdmin 4 - PostgreSQL Tools
  4. #
  5. # Copyright (C) 2013 - 2020, The pgAdmin Development Team
  6. # This software is released under the PostgreSQL Licence
  7. #
  8. ##########################################################################
  9. """Implements Internal Authentication"""
  10. import six
  11. from flask import current_app
  12. from flask_security import login_user
  13. from abc import abstractmethod, abstractproperty
  14. from flask_babelex import gettext
  15. from .registry import AuthSourceRegistry
  16. from pgadmin.model import User
  17. @six.add_metaclass(AuthSourceRegistry)
  18. class BaseAuthentication(object):
  19. DEFAULT_MSG = {
  20. 'USER_DOES_NOT_EXIST': 'Specified user does not exist',
  21. 'LOGIN_FAILED': 'Login failed',
  22. 'EMAIL_NOT_PROVIDED': 'Email/Username not provided',
  23. 'PASSWORD_NOT_PROVIDED': 'Password not provided'
  24. }
  25. @abstractproperty
  26. def get_friendly_name(self):
  27. pass
  28. @abstractmethod
  29. def authenticate(self):
  30. pass
  31. def validate(self, form):
  32. username = form.data['email']
  33. password = form.data['password']
  34. if username is None or username == '':
  35. form.email.errors = list(form.email.errors)
  36. form.email.errors.append(gettext(
  37. self.messages('EMAIL_NOT_PROVIDED')))
  38. return False
  39. if password is None or password == '':
  40. form.password.errors = list(form.password.errors)
  41. form.password.errors.append(
  42. self.messages('PASSWORD_NOT_PROVIDED'))
  43. return False
  44. return True
  45. def login(self, form):
  46. username = form.data['email']
  47. user = getattr(form, 'user', None)
  48. if user is None:
  49. user = User.query.filter_by(username=username).first()
  50. if user is None:
  51. current_app.logger.exception(
  52. self.messages('USER_DOES_NOT_EXIST'))
  53. return False, self.messages('USER_DOES_NOT_EXIST')
  54. # Login user through flask_security
  55. status = login_user(user)
  56. if not status:
  57. current_app.logger.exception(self.messages('LOGIN_FAILED'))
  58. return False, self.messages('LOGIN_FAILED')
  59. return True, None
  60. def messages(self, msg_key):
  61. return self.DEFAULT_MSG[msg_key] if msg_key in self.DEFAULT_MSG\
  62. else None
  63. class InternalAuthentication(BaseAuthentication):
  64. def get_friendly_name(self):
  65. return gettext("internal")
  66. def validate(self, form):
  67. """User validation"""
  68. # Flask security validation
  69. return form.validate_on_submit()
  70. def authenticate(self, form):
  71. username = form.data['email']
  72. user = getattr(form, 'user',
  73. User.query.filter_by(username=username).first())
  74. if user and user.is_authenticated and form.validate_on_submit():
  75. return True, None
  76. return False, self.messages('USER_DOES_NOT_EXIST')
上海开阖软件有限公司 沪ICP备12045867号-1