Skip to content

Commit b4b4e12

Browse files
authored
Merge pull request #166 from permitio/raz/per-10289-support-ngnix
add allowed ngnix support
2 parents 51d2416 + 401128e commit b4b4e12

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

horizon/enforcer/api.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
UserTenantsResult,
3636
AuthorizedUsersResult,
3737
AuthorizedUsersAuthorizationQuery,
38+
User,
3839
)
3940
from horizon.enforcer.schemas_kong import (
4041
KongAuthorizationInput,
@@ -43,6 +44,7 @@
4344
KongWrappedAuthorizationQuery,
4445
)
4546
from horizon.enforcer.schemas_v1 import AuthorizationQueryV1
47+
from horizon.enforcer.utils.headers_utils import get_case_insensitive
4648
from horizon.enforcer.utils.mapping_rules_utils import MappingRulesUtils
4749
from horizon.enforcer.utils.statistics_utils import StatisticsManager
4850
from horizon.state import PersistentStateHandler
@@ -553,6 +555,51 @@ async def is_allowed(
553555
)
554556
return result
555557

558+
@router.post(
559+
"/nginx_allowed",
560+
response_model=AuthorizationResult,
561+
status_code=status.HTTP_200_OK,
562+
response_model_exclude_none=True,
563+
dependencies=[Depends(enforce_pdp_token)],
564+
)
565+
async def is_allowed_nginx(
566+
request: Request,
567+
permit_user_key: str = Header(None),
568+
permit_tenant_id: str = Header(None),
569+
permit_action: str = Header(None),
570+
permit_resource_type: str = Header(None),
571+
):
572+
573+
query = AuthorizationQuery(
574+
user=User(key=permit_user_key),
575+
action=permit_action,
576+
resource=Resource(type=permit_resource_type, tenant=permit_tenant_id),
577+
)
578+
579+
response = await _is_allowed(query, request, MAIN_POLICY_PACKAGE)
580+
log_query_result(query, response)
581+
try:
582+
raw_result = json.loads(response.body).get("result", {})
583+
processed_query = (
584+
get_v1_processed_query(raw_result)
585+
or get_v2_processed_query(raw_result)
586+
or {}
587+
)
588+
result = {
589+
"allow": raw_result.get("allow", False),
590+
"result": raw_result.get(
591+
"allow", False
592+
), # fallback for older sdks (TODO: remove)
593+
"query": processed_query,
594+
"debug": raw_result.get("debug", {}),
595+
}
596+
except:
597+
result = dict(allow=False, result=False)
598+
logger.warning(
599+
"is allowed (fallback response)", reason="cannot decode opa response"
600+
)
601+
return result
602+
556603
@router.post(
557604
"/kong",
558605
response_model=KongAuthorizationResult,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
def get_case_insensitive(dictionary, key) -> str | None:
2+
if isinstance(key, str):
3+
return next(
4+
(dictionary[k] for k in dictionary if k.lower() == key.lower()), None
5+
)
6+
return dictionary.get(key, None)

0 commit comments

Comments
 (0)