完善权限缓存与监控指标

This commit is contained in:
Cheng Zhou
2026-05-19 16:03:27 +08:00
parent f8a959b801
commit e95eeed90e
14 changed files with 603 additions and 335 deletions
+44 -44
View File
@@ -30,7 +30,7 @@ async def test_get_api_endpoint_permissions_with_custom(db_session: AsyncSession
perm = ApiEndpointPermission(
study_id=study_id,
role="CRA",
endpoint_key="POST:/subjects",
endpoint_key="subjects:create",
allowed=True,
)
db_session.add(perm)
@@ -40,8 +40,8 @@ async def test_get_api_endpoint_permissions_with_custom(db_session: AsyncSession
assert isinstance(result, dict)
assert "CRA" in result
assert "POST:/subjects" in result["CRA"]
assert result["CRA"]["POST:/subjects"]["allowed"] is True
assert "subjects:create" in result["CRA"]
assert result["CRA"]["subjects:create"]["allowed"] is True
@pytest.mark.asyncio
@@ -51,9 +51,9 @@ async def test_replace_api_endpoint_permissions_single_role(db_session: AsyncSes
payload = {
"CRA": {
"POST:/subjects": True,
"GET:/subjects": True,
"PATCH:/subjects/{id}": True,
"subjects:create": True,
"subjects:list": True,
"subjects:update": True,
}
}
@@ -61,9 +61,9 @@ async def test_replace_api_endpoint_permissions_single_role(db_session: AsyncSes
assert isinstance(result, dict)
assert "CRA" in result
assert result["CRA"]["POST:/subjects"]["allowed"] is True
assert result["CRA"]["GET:/subjects"]["allowed"] is True
assert result["CRA"]["PATCH:/subjects/{id}"]["allowed"] is True
assert result["CRA"]["subjects:create"]["allowed"] is True
assert result["CRA"]["subjects:list"]["allowed"] is True
assert result["CRA"]["subjects:update"]["allowed"] is True
@pytest.mark.asyncio
@@ -73,21 +73,21 @@ async def test_replace_api_endpoint_permissions_multiple_roles(db_session: Async
payload = {
"CRA": {
"POST:/subjects": True,
"GET:/subjects": True,
"subjects:create": True,
"subjects:list": True,
},
"PV": {
"GET:/subjects": True,
"GET:/subjects/{id}": True,
"subjects:list": True,
"subjects:read": True,
}
}
result = await replace_api_endpoint_permissions(db_session, study_id, payload)
assert result["CRA"]["POST:/subjects"]["allowed"] is True
assert result["CRA"]["GET:/subjects"]["allowed"] is True
assert result["PV"]["GET:/subjects"]["allowed"] is True
assert result["PV"]["GET:/subjects/{id}"]["allowed"] is True
assert result["CRA"]["subjects:create"]["allowed"] is True
assert result["CRA"]["subjects:list"]["allowed"] is True
assert result["PV"]["subjects:list"]["allowed"] is True
assert result["PV"]["subjects:read"]["allowed"] is True
@pytest.mark.asyncio
@@ -97,13 +97,13 @@ async def test_replace_api_endpoint_permissions_deny(db_session: AsyncSession):
payload = {
"PV": {
"POST:/subjects": False,
"subjects:create": False,
}
}
result = await replace_api_endpoint_permissions(db_session, study_id, payload)
assert result["PV"]["POST:/subjects"]["allowed"] is False
assert result["PV"]["subjects:create"]["allowed"] is False
@pytest.mark.asyncio
@@ -115,7 +115,7 @@ async def test_replace_api_endpoint_permissions_overwrites_existing(db_session:
perm = ApiEndpointPermission(
study_id=study_id,
role="CRA",
endpoint_key="POST:/subjects",
endpoint_key="subjects:create",
allowed=True,
)
db_session.add(perm)
@@ -124,13 +124,13 @@ async def test_replace_api_endpoint_permissions_overwrites_existing(db_session:
# 替换权限
payload = {
"CRA": {
"POST:/subjects": False,
"subjects:create": False,
}
}
result = await replace_api_endpoint_permissions(db_session, study_id, payload)
assert result["CRA"]["POST:/subjects"]["allowed"] is False
assert result["CRA"]["subjects:create"]["allowed"] is False
@pytest.mark.asyncio
@@ -140,23 +140,23 @@ async def test_replace_api_endpoint_permissions_multiple_endpoints(db_session: A
payload = {
"CRA": {
"POST:/subjects": True,
"GET:/subjects": True,
"PATCH:/subjects/{id}": True,
"DELETE:/subjects/{id}": False,
"POST:/risk-issues": True,
"GET:/risk-issues": True,
"subjects:create": True,
"subjects:list": True,
"subjects:update": True,
"subjects:delete": False,
"risk_issues:create": True,
"risk_issues:list": True,
}
}
result = await replace_api_endpoint_permissions(db_session, study_id, payload)
assert result["CRA"]["POST:/subjects"]["allowed"] is True
assert result["CRA"]["GET:/subjects"]["allowed"] is True
assert result["CRA"]["PATCH:/subjects/{id}"]["allowed"] is True
assert result["CRA"]["DELETE:/subjects/{id}"]["allowed"] is False
assert result["CRA"]["POST:/risk-issues"]["allowed"] is True
assert result["CRA"]["GET:/risk-issues"]["allowed"] is True
assert result["CRA"]["subjects:create"]["allowed"] is True
assert result["CRA"]["subjects:list"]["allowed"] is True
assert result["CRA"]["subjects:update"]["allowed"] is True
assert result["CRA"]["subjects:delete"]["allowed"] is False
assert result["CRA"]["risk_issues:create"]["allowed"] is True
assert result["CRA"]["risk_issues:list"]["allowed"] is True
@pytest.mark.asyncio
@@ -167,13 +167,13 @@ async def test_replace_api_endpoint_permissions_different_studies(db_session: As
payload_1 = {
"CRA": {
"POST:/subjects": True,
"subjects:create": True,
}
}
payload_2 = {
"CRA": {
"POST:/subjects": False,
"subjects:create": False,
}
}
@@ -183,8 +183,8 @@ async def test_replace_api_endpoint_permissions_different_studies(db_session: As
result_1 = await get_api_endpoint_permissions(db_session, study_id_1)
result_2 = await get_api_endpoint_permissions(db_session, study_id_2)
assert result_1["CRA"]["POST:/subjects"]["allowed"] is True
assert result_2["CRA"]["POST:/subjects"]["allowed"] is False
assert result_1["CRA"]["subjects:create"]["allowed"] is True
assert result_2["CRA"]["subjects:create"]["allowed"] is False
@pytest.mark.asyncio
@@ -209,13 +209,13 @@ async def test_replace_api_endpoint_permissions_partial_update(db_session: Async
perm1 = ApiEndpointPermission(
study_id=study_id,
role="CRA",
endpoint_key="POST:/subjects",
endpoint_key="subjects:create",
allowed=True,
)
perm2 = ApiEndpointPermission(
study_id=study_id,
role="CRA",
endpoint_key="GET:/subjects",
endpoint_key="subjects:list",
allowed=True,
)
db_session.add(perm1)
@@ -225,16 +225,16 @@ async def test_replace_api_endpoint_permissions_partial_update(db_session: Async
# 只更新一个权限
payload = {
"CRA": {
"POST:/subjects": False,
"subjects:create": False,
}
}
result = await replace_api_endpoint_permissions(db_session, study_id, payload)
# POST权限应该被更新
assert result["CRA"]["POST:/subjects"]["allowed"] is False
assert result["CRA"]["subjects:create"]["allowed"] is False
# GET权限应该保持不变
assert result["CRA"]["GET:/subjects"]["allowed"] is True
assert result["CRA"]["subjects:list"]["allowed"] is True
@pytest.mark.asyncio
@@ -246,7 +246,7 @@ async def test_get_api_endpoint_permissions_structure(db_session: AsyncSession):
perm = ApiEndpointPermission(
study_id=study_id,
role="CRA",
endpoint_key="POST:/subjects",
endpoint_key="subjects:create",
allowed=True,
)
db_session.add(perm)