fix: handle missing LoginProfile in disable/enable/edit

- Skip LoginProfile operations when user has no console password
- Only send non-empty fields to Volcengine UpdateUser API
- Fixes enable_user crash for users created without password

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
seaislee1209 2026-03-28 21:15:05 +08:00
parent ff0d0de8f8
commit 92172c6ec8
2 changed files with 24 additions and 11 deletions

View File

@ -467,11 +467,12 @@ def iam_user_edit_profile_view(request, pk):
sk = decrypt(account.secret_key_enc) sk = decrypt(account.secret_key_enc)
iam = IAMService(ak, sk) iam = IAMService(ak, sk)
# Only pass non-empty values to Volcengine (empty strings are rejected)
try: try:
iam.update_user(user.username, iam.update_user(user.username,
display_name=display_name, display_name=display_name if display_name else None,
email=email, email=email if email else None,
phone=phone) phone=phone if phone else None)
except VolcengineAPIError as e: except VolcengineAPIError as e:
return Response({'message': f'火山 API 更新失败: {e}'}, return Response({'message': f'火山 API 更新失败: {e}'},
status=status.HTTP_400_BAD_REQUEST) status=status.HTTP_400_BAD_REQUEST)

View File

@ -197,14 +197,25 @@ class IAMService:
except VolcengineAPIError: except VolcengineAPIError:
pass pass
def _has_login_profile(self, username: str) -> bool:
"""检查用户是否有 LoginProfile"""
try:
self.get_login_profile(username)
return True
except VolcengineAPIError as e:
if "LoginProfileNotExist" in str(e) or "RecordNotFound" in str(e):
return False
raise
def disable_user(self, username: str): def disable_user(self, username: str):
"""完全停用用户:停控制台 + 停所有 AccessKey""" """完全停用用户:停控制台 + 停所有 AccessKey"""
errors = [] errors = []
try: if self._has_login_profile(username):
self.update_login_allowed(username, False) try:
except VolcengineAPIError as e: self.update_login_allowed(username, False)
errors.append(f"停用控制台失败: {e}") except VolcengineAPIError as e:
errors.append(f"停用控制台失败: {e}")
try: try:
keys = self.list_access_keys(username) keys = self.list_access_keys(username)
@ -221,10 +232,11 @@ class IAMService:
"""恢复用户:恢复控制台 + 恢复所有 AccessKey""" """恢复用户:恢复控制台 + 恢复所有 AccessKey"""
errors = [] errors = []
try: if self._has_login_profile(username):
self.update_login_allowed(username, True) try:
except VolcengineAPIError as e: self.update_login_allowed(username, True)
errors.append(f"恢复控制台失败: {e}") except VolcengineAPIError as e:
errors.append(f"恢复控制台失败: {e}")
try: try:
keys = self.list_access_keys(username) keys = self.list_access_keys(username)