3030from .database .repository import (
3131 Repository ,
3232)
33+ from .urlmatch .autzmatch import (
34+ AutzMatch ,
35+ )
3336
3437logger = logging .getLogger (__name__ )
3538
@@ -47,20 +50,44 @@ async def orchestrate(request: web.Request) -> web.Response:
4750 auth = request .app ["config" ].rest .auth
4851 user = None
4952 if auth is not None and auth .enabled :
50- if await check_auth (request = request , service = request .url .parts [1 ], url = str (request .url ), method = request .method ):
53+ if await check_authentication (
54+ request = request , service = request .url .parts [1 ], url = str (request .url ), method = request .method
55+ ):
5156 response = await validate_token (request )
5257 user = json .loads (response )
5358 user = user ["uuid" ]
5459
60+ if await check_authorization (
61+ request = request , service = request .url .parts [1 ], url = str (request .url ), method = request .method
62+ ):
63+ response = await validate_token (request )
64+ data = json .loads (response )
65+ user = data ["uuid" ]
66+ role = data ["role" ]
67+ if not await is_authorized_role (
68+ request = request , role = role , service = request .url .parts [1 ], url = str (request .url ), method = request .method
69+ ):
70+ return web .HTTPUnauthorized ()
71+
5572 microservice_response = await call (** discovery_data , original_req = request , user = user )
5673 return microservice_response
5774
5875
59- async def check_auth (request : web .Request , service : str , url : str , method : str ) -> bool :
76+ async def check_authentication (request : web .Request , service : str , url : str , method : str ) -> bool :
6077 records = Repository (request .app ["db_engine" ]).get_auth_rule_by_service (service )
6178 return AuthMatch .match (url = url , method = method , records = records )
6279
6380
81+ async def check_authorization (request : web .Request , service : str , url : str , method : str ) -> bool :
82+ records = Repository (request .app ["db_engine" ]).get_autz_rule_by_service (service )
83+ return AuthMatch .match (url = url , method = method , records = records )
84+
85+
86+ async def is_authorized_role (request : web .Request , role : int , service : str , url : str , method : str ) -> bool :
87+ records = Repository (request .app ["db_engine" ]).get_autz_rule_by_service (service )
88+ return AutzMatch .match (url = url , role = role , method = method , records = records )
89+
90+
6491async def authentication_default (request : web .Request ) -> web .Response :
6592 """ Orchestrate discovery and microservice call """
6693 auth_host = request .app ["config" ].rest .auth .host
0 commit comments