test_admin_login_switch.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """超级管理员登录开关(安全需求7):
  2. - 登录:开关关闭时 admin 按用户不存在处理,报错与密码错误完全一致(同一出口);
  3. - 创建:开关关闭时拒绝创建 admin 用户名,报"不能创建该名称的用户"
  4. 而非"用户名已存在",不泄露系统中存在该账号。
  5. 不依赖测试库:登录用例将审计落库置空;创建用例的拦截发生在事务开启之前。
  6. """
  7. from __future__ import annotations
  8. from types import SimpleNamespace
  9. import pytest
  10. from dms.common.errors import InvalidArgumentError
  11. from dms.services import user_service
  12. @pytest.fixture()
  13. def admin_login_off(flask_app, monkeypatch):
  14. flask_app.config["DMS_ALLOW_ADMIN_LOGIN"] = False
  15. # admin 拦截走"用户名不存在"出口:审计落库置空,全程不触测试库
  16. monkeypatch.setattr(
  17. "dms.api.v1.auth.record_login_failure", lambda **kwargs: None
  18. )
  19. yield flask_app
  20. flask_app.config["DMS_ALLOW_ADMIN_LOGIN"] = True
  21. def test_login_blocked_admin_reports_invalid_credentials(admin_login_off):
  22. """开关关闭:admin 正确/错误密码一律 INVALID_CREDENTIALS,与密码错误同形。"""
  23. client = admin_login_off.test_client()
  24. response = client.post(
  25. "/api/v1/auth/login",
  26. json={"username": "admin", "password": "whatever", "keepSignedIn": False},
  27. )
  28. assert response.status_code == 401
  29. assert response.get_json()["code"] == "INVALID_CREDENTIALS"
  30. def test_create_admin_username_rejected_when_disabled(flask_app, monkeypatch):
  31. """开关关闭:创建 admin 报"不能创建该名称的用户",而非"用户名已存在"。"""
  32. flask_app.config["DMS_ALLOW_ADMIN_LOGIN"] = False
  33. monkeypatch.setattr(
  34. user_service, "get_auth_context", lambda: SimpleNamespace(user_id=1)
  35. )
  36. payload = {
  37. "username": "admin",
  38. "realName": "冒名者",
  39. "initialPassword": "Passw0rd!2024",
  40. "organizationId": "1",
  41. "roleCode": "USER",
  42. "roleId": "2",
  43. "securityLevel": "PUBLIC",
  44. "status": "ENABLED",
  45. }
  46. try:
  47. with flask_app.app_context(), pytest.raises(InvalidArgumentError) as exc:
  48. user_service.create_user(payload)
  49. assert "不能创建该名称的用户" in str(exc.value)
  50. finally:
  51. flask_app.config["DMS_ALLOW_ADMIN_LOGIN"] = True