mirror of
https://github.com/tiennm99/litellm.git
synced 2026-08-02 14:22:16 +00:00
feat(handle_jwt.py): initial commit adding custom RBAC support on jwt… (#8037)
* feat(handle_jwt.py): initial commit adding custom RBAC support on jwt auth allows admin to define user role field and allowed roles which map to 'internal_user' on litellm * fix(auth_checks.py): ensure user allowed to access model, when calling via personal keys Fixes https://github.com/BerriAI/litellm/issues/8029 * feat(handle_jwt.py): support role based access with model permission control on proxy Allows admin to just grant users roles on IDP (e.g. Azure AD/Keycloak) and user can immediately start calling models * docs(rbac): add docs on rbac for model access control make it clear how admin can use roles to control model access on proxy * fix: fix linting errors * test(test_user_api_key_auth.py): add unit testing to ensure rbac role is correctly enforced * test(test_user_api_key_auth.py): add more testing * test(test_users.py): add unit testing to ensure user model access is always checked for new keys Resolves https://github.com/BerriAI/litellm/issues/8029 * test: fix unit test * fix(dot_notation_indexing.py): fix typing to work with python 3.8
This commit is contained in:
@@ -855,6 +855,8 @@ async def test_jwt_user_api_key_auth_builder_enforce_rbac(enforce_rbac, monkeypa
|
||||
"user_api_key_cache": Mock(),
|
||||
"parent_otel_span": None,
|
||||
"proxy_logging_obj": Mock(),
|
||||
"request_data": {},
|
||||
"general_settings": {},
|
||||
}
|
||||
|
||||
if enforce_rbac:
|
||||
@@ -877,3 +879,55 @@ def test_user_api_key_auth_end_user_str():
|
||||
|
||||
user_api_key_auth = UserAPIKeyAuth(**user_api_key_args)
|
||||
assert user_api_key_auth.end_user_id == "1"
|
||||
|
||||
|
||||
def test_can_rbac_role_call_model():
|
||||
from litellm.proxy.auth.user_api_key_auth import can_rbac_role_call_model
|
||||
from litellm.proxy._types import RoleBasedPermissions
|
||||
|
||||
roles_based_permissions = [
|
||||
RoleBasedPermissions(
|
||||
role=LitellmUserRoles.INTERNAL_USER,
|
||||
models=["gpt-4"],
|
||||
),
|
||||
RoleBasedPermissions(
|
||||
role=LitellmUserRoles.PROXY_ADMIN,
|
||||
models=["anthropic-claude"],
|
||||
),
|
||||
]
|
||||
|
||||
assert can_rbac_role_call_model(
|
||||
rbac_role=LitellmUserRoles.INTERNAL_USER,
|
||||
general_settings={"role_permissions": roles_based_permissions},
|
||||
model="gpt-4",
|
||||
)
|
||||
|
||||
with pytest.raises(HTTPException):
|
||||
can_rbac_role_call_model(
|
||||
rbac_role=LitellmUserRoles.INTERNAL_USER,
|
||||
general_settings={"role_permissions": roles_based_permissions},
|
||||
model="gpt-4o",
|
||||
)
|
||||
|
||||
with pytest.raises(HTTPException):
|
||||
can_rbac_role_call_model(
|
||||
rbac_role=LitellmUserRoles.PROXY_ADMIN,
|
||||
general_settings={"role_permissions": roles_based_permissions},
|
||||
model="gpt-4o",
|
||||
)
|
||||
|
||||
|
||||
def test_can_rbac_role_call_model_no_role_permissions():
|
||||
from litellm.proxy.auth.user_api_key_auth import can_rbac_role_call_model
|
||||
|
||||
assert can_rbac_role_call_model(
|
||||
rbac_role=LitellmUserRoles.INTERNAL_USER,
|
||||
general_settings={},
|
||||
model="gpt-4",
|
||||
)
|
||||
|
||||
assert can_rbac_role_call_model(
|
||||
rbac_role=LitellmUserRoles.PROXY_ADMIN,
|
||||
general_settings={"role_permissions": []},
|
||||
model="anthropic-claude",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user