Skip to content

Commit b362193

Browse files
ISSUE #92
1 parent 9f462f9 commit b362193

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

minos/api_gateway/rest/database/repository.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,11 @@ def get_auth_rule_by_service(self, service: str):
6868
for record in r:
6969
records.append(AuthRuleDTO(record))
7070
return records
71+
72+
def get_autz_rule_by_service(self, service: str):
73+
r = self.session.query(AutzRule).filter(or_(AutzRule.service == service, AutzRule.service == "*")).all()
74+
75+
records = list()
76+
for record in r:
77+
records.append(AutzRuleDTO(record))
78+
return records

minos/api_gateway/rest/handler.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
from .database.repository import (
3131
Repository,
3232
)
33+
from .urlmatch.autzmatch import (
34+
AutzMatch,
35+
)
3336

3437
logger = 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+
6491
async def authentication_default(request: web.Request) -> web.Response:
6592
""" Orchestrate discovery and microservice call """
6693
auth_host = request.app["config"].rest.auth.host
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from ..database.models import (
2+
AuthRuleDTO,
3+
AutzRuleDTO,
4+
)
5+
from .urlmatch import (
6+
UrlMatch,
7+
)
8+
9+
10+
class AutzMatch(UrlMatch):
11+
@staticmethod
12+
def match(url: str, role: int, method: str, records: list[AutzRuleDTO]) -> bool:
13+
for record in records:
14+
if AutzMatch.urlmatch(record.rule, url):
15+
if record.roles is None: # pragma: no cover
16+
return True
17+
else:
18+
if role in record.roles or "*" in record.roles:
19+
return True
20+
21+
return False

0 commit comments

Comments
 (0)