Source code for pigauth._auth
import dataclasses
from typing import Iterable, List, Dict
PermissionId = str
[docs]@dataclasses.dataclass(frozen=True)
class Permission:
"""Describe permission"""
permission_id: PermissionId
requires: list = dataclasses.field(default_factory=list)
Permissions = List[Permission]
PermissionMap = Dict[PermissionId, Permission]
PermissionGrant = str
PermissionGrants = Iterable[PermissionGrant]
RoleId = str
[docs]@dataclasses.dataclass(frozen=True)
class Role:
"""Describe authorization role"""
role_id: RoleId
grants: PermissionGrants = dataclasses.field(default_factory=list)
is_default: bool = False
def __hash__(self) -> int:
"""Implementing proper hash function makes the Role instances hashable.
For example, Role instances can be used as dictionary indexes or in sets.
"""
return hash(self.role_id)
Roles = List[Role]
RoleMap = Dict[RoleId, Role]
RoleGrants = Iterable[RoleId]
[docs]@dataclasses.dataclass(frozen=True)
class Scheme:
"""Describe authorization scheme"""
roles: RoleMap = dataclasses.field(default_factory=dict)
permissions: PermissionMap = dataclasses.field(default_factory=dict)
[docs] def add_permission(self, permission: Permission):
self.permissions[permission.permission_id] = permission
return self
[docs] def add_role(self, role: Role):
self.roles[role.role_id] = role
return self
[docs]class Resolver:
"""Resolve effective grants against authorization scheme"""
scheme: Scheme
def __init__(self, scheme: Scheme):
self.scheme = scheme
[docs] def resolve(
self, permission_grants: PermissionGrants, role_grants: RoleGrants
) -> PermissionGrants:
"""Resolve effective permission grants"""
effective_grants = set(permission_grants)
for role_id in self.resolve_roles(role_grants):
effective_grants.update(self.scheme.roles[role_id].grants)
return effective_grants
[docs] def resolve_roles(self, role_grants: RoleGrants) -> RoleGrants:
"""Resolve effective role grants"""
effective_grants = set(role_grants)
for role in self.scheme.roles.values():
if role.is_default:
effective_grants.add(role.role_id)
return effective_grants