@@ -666,7 +666,12 @@ def recovery_email(self, request: Request, pk: int) -> Response:
666666
667667 @permission_required ("authentik_core.impersonate" )
668668 @extend_schema (
669- request = OpenApiTypes .NONE ,
669+ request = inline_serializer (
670+ "ImpersonationSerializer" ,
671+ {
672+ "reason" : CharField (required = True ),
673+ },
674+ ),
670675 responses = {
671676 "204" : OpenApiResponse (description = "Successfully started impersonation" ),
672677 "401" : OpenApiResponse (description = "Access denied" ),
@@ -679,6 +684,7 @@ def impersonate(self, request: Request, pk: int) -> Response:
679684 LOGGER .debug ("User attempted to impersonate" , user = request .user )
680685 return Response (status = 401 )
681686 user_to_be = self .get_object ()
687+ reason = request .data .get ("reason" , "" )
682688 # Check both object-level perms and global perms
683689 if not request .user .has_perm (
684690 "authentik_core.impersonate" , user_to_be
@@ -688,11 +694,14 @@ def impersonate(self, request: Request, pk: int) -> Response:
688694 if user_to_be .pk == self .request .user .pk :
689695 LOGGER .debug ("User attempted to impersonate themselves" , user = request .user )
690696 return Response (status = 401 )
697+ if not reason and request .tenant .impersonation_require_reason :
698+ LOGGER .debug ("User attempted to impersonate without providing a reason" , user = request .user )
699+ return Response (status = 401 )
691700
692701 request .session [SESSION_KEY_IMPERSONATE_ORIGINAL_USER ] = request .user
693702 request .session [SESSION_KEY_IMPERSONATE_USER ] = user_to_be
694703
695- Event .new (EventAction .IMPERSONATION_STARTED ).from_http (request , user_to_be )
704+ Event .new (EventAction .IMPERSONATION_STARTED , reason = reason ).from_http (request , user_to_be )
696705
697706 return Response (status = 201 )
698707
0 commit comments