mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-24 04:50:30 +00:00
feat: login asset face verify acl
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#
|
||||
import inspect
|
||||
import time
|
||||
import uuid
|
||||
from functools import partial
|
||||
from typing import Callable
|
||||
|
||||
@@ -199,53 +200,6 @@ class AuthPreCheckMixin:
|
||||
self.raise_credential_error(errors.reason_user_not_exist)
|
||||
|
||||
|
||||
class MFAFaceMixin:
|
||||
request = None
|
||||
|
||||
def get_face_recognition_token(self):
|
||||
from authentication.const import MFA_FACE_SESSION_KEY
|
||||
token = self.request.session.get(MFA_FACE_SESSION_KEY)
|
||||
if not token:
|
||||
raise ValueError("Face recognition token is missing from the session.")
|
||||
return token
|
||||
|
||||
@staticmethod
|
||||
def get_face_cache_key(token):
|
||||
from authentication.const import MFA_FACE_CONTEXT_CACHE_KEY_PREFIX
|
||||
return f"{MFA_FACE_CONTEXT_CACHE_KEY_PREFIX}_{token}"
|
||||
|
||||
def get_face_recognition_context(self):
|
||||
token = self.get_face_recognition_token()
|
||||
cache_key = self.get_face_cache_key(token)
|
||||
context = cache.get(cache_key)
|
||||
if not context:
|
||||
raise ValueError(f"Face recognition context does not exist for token: {token}")
|
||||
return context
|
||||
|
||||
@staticmethod
|
||||
def is_context_finished(context):
|
||||
return context.get('is_finished', False)
|
||||
|
||||
@staticmethod
|
||||
def is_context_success(context):
|
||||
return context.get('success', False)
|
||||
|
||||
def get_face_code(self):
|
||||
context = self.get_face_recognition_context()
|
||||
|
||||
if not self.is_context_finished(context):
|
||||
raise RuntimeError("Face recognition is not yet completed.")
|
||||
|
||||
if not self.is_context_success(context):
|
||||
msg = context.get('error_message', '')
|
||||
raise RuntimeError(msg)
|
||||
|
||||
face_code = context.get('face_code')
|
||||
if not face_code:
|
||||
raise ValueError("Face code is missing from the context.")
|
||||
return face_code
|
||||
|
||||
|
||||
class MFAMixin:
|
||||
request: Request
|
||||
get_user_from_session: Callable
|
||||
@@ -475,7 +429,70 @@ class AuthACLMixin:
|
||||
return ticket
|
||||
|
||||
|
||||
class AuthMixin(CommonMixin, AuthPreCheckMixin, AuthACLMixin, MFAMixin, AuthPostCheckMixin):
|
||||
class AuthFaceMixin:
|
||||
request: Request
|
||||
|
||||
@staticmethod
|
||||
def _get_face_cache_key(token):
|
||||
from authentication.const import FACE_CONTEXT_CACHE_KEY_PREFIX
|
||||
return f"{FACE_CONTEXT_CACHE_KEY_PREFIX}_{token}"
|
||||
|
||||
@staticmethod
|
||||
def _is_context_finished(context):
|
||||
return context.get('is_finished', False)
|
||||
|
||||
@staticmethod
|
||||
def _is_context_success(context):
|
||||
return context.get('success', False)
|
||||
|
||||
def create_face_verify_context(self, data=None):
|
||||
token = uuid.uuid4().hex
|
||||
context_data = {
|
||||
"action": "mfa",
|
||||
"token": token,
|
||||
"is_finished": False
|
||||
}
|
||||
if data:
|
||||
context_data.update(data)
|
||||
|
||||
cache_key = self._get_face_cache_key(token)
|
||||
from .const import FACE_CONTEXT_CACHE_TTL, FACE_SESSION_KEY
|
||||
cache.set(cache_key, context_data, FACE_CONTEXT_CACHE_TTL)
|
||||
self.request.session[FACE_SESSION_KEY] = token
|
||||
return token
|
||||
|
||||
def get_face_token_from_session(self):
|
||||
from authentication.const import FACE_SESSION_KEY
|
||||
token = self.request.session.get(FACE_SESSION_KEY)
|
||||
if not token:
|
||||
raise ValueError("Face recognition token is missing from the session.")
|
||||
return token
|
||||
|
||||
def get_face_verify_context(self):
|
||||
token = self.get_face_token_from_session()
|
||||
cache_key = self._get_face_cache_key(token)
|
||||
context = cache.get(cache_key)
|
||||
if not context:
|
||||
raise ValueError(f"Face recognition context does not exist for token: {token}")
|
||||
return context
|
||||
|
||||
def get_face_code(self):
|
||||
context = self.get_face_verify_context()
|
||||
|
||||
if not self._is_context_finished(context):
|
||||
raise RuntimeError("Face recognition is not yet completed.")
|
||||
|
||||
if not self._is_context_success(context):
|
||||
msg = context.get('error_message', '')
|
||||
raise RuntimeError(msg)
|
||||
|
||||
face_code = context.get('face_code')
|
||||
if not face_code:
|
||||
raise ValueError("Face code is missing from the context.")
|
||||
return face_code
|
||||
|
||||
|
||||
class AuthMixin(CommonMixin, AuthPreCheckMixin, AuthACLMixin, AuthFaceMixin, MFAMixin, AuthPostCheckMixin, ):
|
||||
request = None
|
||||
partial_credential_error = None
|
||||
|
||||
|
Reference in New Issue
Block a user