py.lib.aw_web_tools

Yohn Y. 2024-11-09 Parent:9c734271dcf2 Child:0920ae304dfd

10:74f5377d83ab Go to Latest

py.lib.aw_web_tools/src/aw_web_tools/authelia_helper.py

. Исправление опечаток и неточностей

History
1 # coding: utf-8
2 """\
3 Поддержка работы с системой авторизации [authelia](https://www.authelia.com/)
4 """
5 import bottle
6 from typing import Optional, List
7 from collections import namedtuple
9 from . import Error
12 # Константы
13 HEADER_USER = 'Remote-User' # Заголовок по умолчанию, в котором система аутентификации передаёт имя УЗ пользователя
14 HEADER_GROUPS = 'Remote-Groups' # Заголовок по умолчанию, в котором система аутентификации передаёт группы пользовтеля
15 HEADER_EMAIL = 'Remote-Email' # Заголовок по умолчанию, в котором система аутентификации передаёт e-mail пользователя
16 HEADER_NAME = 'Remote-Name' # Заголовок по умолчанию, в котором система аутентификации передаёт имя пользователя
19 class AHError(Error):
20 """\
21 Базовый класс исключений модуля адаптера Authelia
22 """
25 class AHAuthError(AHError):
26 """\
27 Проблемы с авторизацией пользователя
28 """
29 def __init__(self):
30 super().__init__('Пользователь не авторизован')
33 AHUser = namedtuple('AHUser', ['uname', 'groups', 'email', 'name'])
36 class AutheliaHelper(object):
37 def __init__(self,
38 group_filter: Optional[List[str]] = None,
39 header_user: str = HEADER_USER,
40 header_groups: str = HEADER_GROUPS,
41 header_email: str = HEADER_EMAIL,
42 header_name: str = HEADER_NAME
43 ):
44 """\
45 :param group_filter: Фильтр передаваемый системой аутентификации групп, которые интересны нам. Если ``None``
46 группы, передаваемые в заголовке не фильтруются
47 :param header_user: Имя заголовка с именем УЗ пользователя.
48 :param header_groups: Имя заголовка с группами пользователя
49 :param header_email: Имя заголовка c e-mail пользователя
50 :param header_name: Имя заголовка с именем пользователя
51 """
52 self.header_user = header_user
53 self.header_groups = header_groups
54 self.header_email = header_email
55 self.header_name = header_name
57 self.group_filter = None
58 self.group_filter_set = None
59 if group_filter is not None:
60 self.group_filter = {}
61 for i in group_filter:
62 self.group_filter[i.lower()] = i
64 self.group_filter_set = set(self.group_filter.keys())
66 def __call__(self, request: bottle.BaseRequest = bottle.request) -> AHUser:
67 """\
68 Обработка запроса. Если заголовки системы авторизации присутствуют, информацией из них заполняется
69 объект ``AHUser``. Если данные не найдены, то будет возбуждено исключение.
71 :param request: Обрабатываемый запрос
72 :returns: Объект ``AHUser`` с данным авторизации.
73 """
75 uname = request.get_header(self.header_user)
76 email = request.get_header(self.header_email)
77 name = request.get_header(self.header_name)
78 groups = request.get_header(self.header_groups)
80 if uname is None:
81 raise AHAuthError()
83 if groups is not None:
84 groups = tuple(map(lambda x: x.stip(), groups.split(',')))
85 if self.group_filter is not None:
86 _groups = []
87 _buf = set(map(lambda x: x.lower(), groups))
89 for grp in _buf & self.group_filter_set:
90 try:
91 _groups.append(self.group_filter[grp])
93 except KeyError:
94 AHError(f'Ошибка в фильтре групп. Для ключа "{grp}" не нашлось значения, хотя оно присутствует '
95 f'в множестве возможных значений.')
97 return AHUser(uname=uname, groups=groups, name=name, email=email)