feat: enhance user authentication with RSA key handling and encrypted data support

v3.2
wxg0103 2025-09-18 18:42:55 +08:00
parent a0118ca397
commit 74c454532d
4 changed files with 17 additions and 4 deletions

View File

@ -20,6 +20,7 @@ from common.constants.authentication_type import AuthenticationType
from common.constants.cache_version import Cache_Version from common.constants.cache_version import Cache_Version
from common.database_model_manage.database_model_manage import DatabaseModelManage from common.database_model_manage.database_model_manage import DatabaseModelManage
from common.exception.app_exception import NotFound404, AppUnauthorizedFailed from common.exception.app_exception import NotFound404, AppUnauthorizedFailed
from common.utils.rsa_util import get_key_pair_by_sql
class AnonymousAuthenticationSerializer(serializers.Serializer): class AnonymousAuthenticationSerializer(serializers.Serializer):
@ -82,7 +83,8 @@ class AuthProfileSerializer(serializers.Serializer):
'authentication_type': application_access_token.authentication_value.get( 'authentication_type': application_access_token.authentication_value.get(
'type', 'password'), 'type', 'password'),
'max_attempts': max_attempts, 'max_attempts': max_attempts,
'login_value': final_login_value 'login_value': final_login_value,
'rasKey' : get_key_pair_by_sql().get('key')
} }
return profile return profile

View File

@ -28,6 +28,6 @@ class SwitchField(BaseField):
@param props_info: @param props_info:
""" """
super().__init__('Switch', label, required, default_value, relation_show_field_dict, super().__init__('SwitchInput', label, required, default_value, relation_show_field_dict,
{}, {},
TriggerType.OPTION_LIST, attrs, props_info) TriggerType.OPTION_LIST, attrs, props_info)

View File

@ -14,7 +14,9 @@ from django.core.cache import cache
from common.constants.cache_version import Cache_Version from common.constants.cache_version import Cache_Version
from common.database_model_manage.database_model_manage import DatabaseModelManage from common.database_model_manage.database_model_manage import DatabaseModelManage
from common.utils.rsa_util import get_key_pair_by_sql
from maxkb import settings from maxkb import settings
from system_manage.models import SystemSetting
class SettingType(models.CharField): class SettingType(models.CharField):
@ -38,4 +40,5 @@ class SystemProfileSerializer(serializers.Serializer):
version = os.environ.get('MAXKB_VERSION') version = os.environ.get('MAXKB_VERSION')
license_is_valid = DatabaseModelManage.get_model('license_is_valid') or (lambda: False) license_is_valid = DatabaseModelManage.get_model('license_is_valid') or (lambda: False)
return {'version': version, 'edition': settings.edition, return {'version': version, 'edition': settings.edition,
'license_is_valid': license_is_valid() if license_is_valid() is not None else False} 'license_is_valid': license_is_valid() if license_is_valid() is not None else False,
'ras': get_key_pair_by_sql().get('key')}

View File

@ -22,6 +22,7 @@ from common.constants.cache_version import Cache_Version
from common.database_model_manage.database_model_manage import DatabaseModelManage from common.database_model_manage.database_model_manage import DatabaseModelManage
from common.exception.app_exception import AppApiException from common.exception.app_exception import AppApiException
from common.utils.common import password_encrypt, get_random_chars from common.utils.common import password_encrypt, get_random_chars
from common.utils.rsa_util import encrypt, decrypt
from maxkb.const import CONFIG from maxkb.const import CONFIG
from users.models import User from users.models import User
@ -31,6 +32,9 @@ class LoginRequest(serializers.Serializer):
password = serializers.CharField(required=True, max_length=128, label=_("Password")) password = serializers.CharField(required=True, max_length=128, label=_("Password"))
captcha = serializers.CharField(required=False, max_length=64, label=_('captcha'), allow_null=True, captcha = serializers.CharField(required=False, max_length=64, label=_('captcha'), allow_null=True,
allow_blank=True) allow_blank=True)
encryptedData = serializers.CharField(required=False, label=_('encryptedData'), allow_null=True,
allow_blank=True)
system_version, system_get_key = Cache_Version.SYSTEM.value system_version, system_get_key = Cache_Version.SYSTEM.value
@ -60,6 +64,10 @@ class LoginSerializer(serializers.Serializer):
@staticmethod @staticmethod
def login(instance): def login(instance):
username = instance.get("username", "") username = instance.get("username", "")
encryptedData = instance.get("encryptedData", "")
if encryptedData:
json_data = json.loads(decrypt(encryptedData))
instance.update(json_data)
try: try:
LoginRequest(data=instance).is_valid(raise_exception=True) LoginRequest(data=instance).is_valid(raise_exception=True)
except Exception as e: except Exception as e:
@ -99,7 +107,7 @@ class LoginSerializer(serializers.Serializer):
if captcha_cache is None or captcha.lower() != captcha_cache: if captcha_cache is None or captcha.lower() != captcha_cache:
raise AppApiException(1005, _("Captcha code error or expiration")) raise AppApiException(1005, _("Captcha code error or expiration"))
user = QuerySet(User).filter(username=username, password=password).first() user = QuerySet(User).filter(username=username, password=password_encrypt(password)).first()
if user is None: if user is None:
record_login_fail(username) record_login_fail(username)
raise AppApiException(500, _('The username or password is incorrect')) raise AppApiException(500, _('The username or password is incorrect'))