Группы пользователей в web-приложении на Python и Starlette

programming

Опубликован:
2025-01-01T03:50:25.387060Z
Отредактирован:
2025-01-01T03:50:25.387060Z
Статус:
публичный
7
0
0

Web-приложение на Python и Starlette, процесс разработки которого мы сосредоточенно исследуем в этом цикле статей, разрабатывается для пользователей. Замысел и техническое задание на разработку предолагают, что не все пользователи будущего web-сайта могут быть равны в правах и возможностях, увы, в современном публичном пространстве это необходимая мера разграничения, иначе, хаос неизбежен. В этом обзоре я покажу организацию групп пользователей по предоставленным им возможностям интерфейса и, собственно, обозначу набор потенциальных возможностей этого интерфейса — пользовательских действий на сайте.

Управление пользователями

В рамках этого цикла статей пользователями приложения я буду считать только авторизованных посетителей будущего web-сайта. Анонимные посетители пользователями не считаются, таков замысел. Поскольку я предполагаю дать возможность всем анонимным пользователям самостоятельно зарегистрироваться на сайте и авторизоваться, в потенциале можно допустить, что пользователей будет много, все они живые люди, и у каждого из них в отношении сайта и других пользователей сайта будут собственные намерения, которые невозможно предсказать или спрогнозировать. Отсюда следует необходимость некоторым образом ограничить в правах абсолютно всех зарегистрировавшихся посетителей.

Что значит ограничить в правах? Допустим на сайте есть собственный хостинг картинок, который предусмотрен только для пишущих материалы сайта авторов. Соответственно, любой самостоятельно зарегистрировавшийся и авторизовавшийся пользователь не может иметь доступ к этой функции, поскольку автором не является. Но доступ к любому функционалу сайта предоставляется посредством соответствующего url-адреса, а набрать нужный url-адрес в адресной строке браузера может любой посетитель. Это значит, что приложение должно отличать автора сайта от обычного посетителя — читателя сайта.

Если у приложения есть пользователи, и они дифференцируются в зависимости от предоставленных им прав, необходимы средства для управления пользователями и их правами. И эти средства должны быть предоставлены определённому пользователю сайта, чьи права в рамках приложения не ограничены. Такого пользователя обычно называют администратором сайта.

Средства управления правами пользователей в web-приложении необходимо продумать и описать кодом, разработать. Задача эта достаточно сложная, её решение невозможно описать единственной статьёй. Эту задачу я буду решать на протяжении нескольких выпусков этого блога, начну с определения потенциально возможных в приложении пользовательских действий и деления пользователей на группы.

Пользовательские действия и группы

Управлять пользователями можно двумя методами:

  1. Изменяя группу, к которой принадлежит пользователь;

  2. Изменяя набор предоставленных пользователю прав на то или иное действие.

Первый вариант менее гибок, но его проще реализовать. Второй вариант великолепен, но ровно до того момента, когда набор функциональных действий умещается в определённое количество, если таких действий будет больше 10, то программирование значительно уложняется и на backend, и на frontend. В рамках этого цикла статей я покажу первый метод управления пользователями и их правами.

Пользовательские действия

Чтобы что-то описать кодом, это что-то необходимо для начала описать простыми человеческими словами. Начнём с набора действий, которые будущий web-сайт готов предоставить своим авторизовавшимся посетителями. Действие обычно описывается глаголом. В этом web-приложении я собираюсь предоставить пользователям следующие действия:

  • Пользователь не может войти в сервис со своим логином и паролем;

  • Пользователь может читать авторские материалы сайта;

  • Пользователь может просматривать профили: свой и других пользователей сайта;

  • Пользователь может создавать ленту, добавляя в неё понравившихся авторов сайта;

  • Пользователь может ставить лайки понравившимся ему авторским материалам;

  • Пользователь может оставлять комментарии к авторским материалам;

  • Пользователь может общаться приватными сообщениями с другими пользователями сайта;

  • Пользователь может ставить дизлайки авторским материалам сайта;

  • Пользователь может пользоваться сервисом коротких ссылок;

  • Пользователь может публиковать собственные авторские статьи — вести свой блог;

  • Пользователь может делать объявления, которые будут отображаться во всех, принадлежащих ему авторских статьях сайта;

  • Пользователь может пользоваться сервисом хранения и публикации изображений — хостингом картинок;

  • Пользователь может изменять группу другим пользователям сайта;

  • Пользователь может блокировать авторские материалы других пользователей и удалять комментарии других пользователей, если они не соответствуют целям и задачам сайта.

Итого, я предполагаю 14 возможных пользовательских действий, управление таким набором действий достаточно сложно программировать, именно поэтому я выбрал второй метод управления пользователями — посредством изменения группы пользователя.

Пользовательские группы

Всех пользователей сайта я преполагаю разделить на следующие пользовательские группы:

  1. Изгои — заблокированные пользователи, которым отказано в авторизации;

  2. Читатели — пользователи, которые могут читать авторские материалы сайта, просматривать профили других пользователей, создавать ленту, ставить лайки;

  3. Комментаторы — пользователи, которые могут оставлять комментарии и общаться с другими пользователями сайта приватными сообщениями;

  4. Комментаторы+ — пользователи, которые могут ставить дизлайки и пользоваться сервисом коротких ссылок;

  5. Писатели — пользователи, которые могут публиковать на сайте собственные авторские материалы и делать объявления для своих читателей;

  6. Писатели+ — пользователи, которые могут пользоваться сервисом хранения изображений;

  7. Хранители — пользователи, которые могут изменять группу другим пользователям сайта;

  8. Хранители+ — пользователи, которые могут блокировать авторские материалы и комментарии других пользователей, если они не соответствуют целям и задачам сайта;

  9. Адиминистраторы — пользователи, чьи действия на сайте неограничены.

Предложенная иерархия является сквозной, то есть, пользователи более высокой группы могут выполнять все действия пользователей предыдущих групп, кроме Изгоев. Комментаторы имеют все права Читателей, Писатели имеют все права Комментаторов и Читателей и так далее по списку.

К программированию этой иерархии я и приступаю, начиная с этого выпуска. Задача эта достаточно сложная, многоуровневая и решаться будет на протяжении почти всего процесса разработки web-приложения.

Описание групп и действий кодом

Вся предложенная иерархия, набор пользовательских действий и совокупность функционала для управления пользователями будут частью системы аутентификации пользователей. Мне понадобится новая подпрограмма в рамках web-приложения, соответственно я должен создать в базовом каталоге web-приложения новый вложенный каталог. Даю ему имя auth от английского authentication.

$ mkdir webapp/auth

Только что созданный каталог будет пакетом, пакеты Python я привык обозначать вложенным "инитом", создаю его.

$ touch webapp/auth/__init__.py

Иерархию пользователей и доступные каждой определённой в этой иерархии группе разрешения я склонен считать пользовательскими атрибутами. И эти атрибуты я должен описать кодом на Питоне. С помощью текстового редактора Vim создаю в каталоге auth новый файл с именем attri.py.

$ vim webapp/auth/attri.py

Иерархическую группу пользователей я планирую определить двумя параметрами:

  • имя группы — строка;

  • вес группы — целое число от 0 до 255 включительно.

Впоследствии оба этих параметра будут храниться в учётной записи каждого зарегистрированного на сайте пользователя, и в соответствии с ними пользователю будут предоставлены соответствующие группе действия. Записывать эти параметры в учётную запись пользователя планируется при создании пользователя и при изменении пользователю группы, в которой он состоит, администратором сайта. Для реализации этого плана мне необходим объект в пространстве имён web-приложения, который будет хранить имена и вес определённых замыслом групп, и у которого их можно запросить простыми питонячими процедурами. Именно начальная разработка такого объекта и есть цель этого этапа разработки.

В только что открытом файле пишу следующий код.

class groups:
    pariah = 'Изгои'
    reader = 'Читатели'
    commentator = 'Комментаторы'
    commentatorpro = 'Комментаторы+'
    blogger = 'Писатели'
    bloggerpro = 'Писатели+'
    keeper = 'Хранители'
    keeperpro = 'Хранители+'
    root = 'Администраторы'

    @classmethod
    def weigh(cls, group):
        if group == cls.pariah:         ## Запрет на вход в сервис
            return 0
        if group == cls.reader:         ## Чтение, Профиль, Лента, Лайки
            return 30
        if group == cls.commentator:    ##+ Комментарии, Приваты
            return 45
        if group == cls.commentatorpro: ##+ Дизлайки, Ссылки
            return 55
        if group == cls.blogger:        ##+ Свой блог, Объявления
            return 100
        if group == cls.bloggerpro:     ##+ Хостинг картинок
            return 150
        if group == cls.keeper:         ##+ Смена группы другим
            return 200
        if group == cls.keeperpro:      ##+ Литовка блогов
            return 250
        if group == cls.root:           ## Без ограничений
            return 255
        return 0

Класс groups хранит в своих свойствах имена всех определённых замыслом пользовательских групп. Имя этого класса начинается строчной буквой латинского алфавита потому, что я не предполагаю создавать экземпляры этого класса, мне нужно только его пространство имён.

Класс построен таким образом, что имя группы можно получить запросом конкретного свойства. При этом вес группы определяется методом weigh (от англ. weigh — взвешивать) этого класса. Этот метод создан с использованием декоратора classmethod и принимает второй аргумент — имя группы — обычную строку. В теле метода я просто проверяю, есть ли среди свойств класса свойство, которое хранит переданное параметром имя группы, если такое свойство имеется, метод возвращает значение веса этой группы. В противном случае метод возвращает ноль.

На данный момент этого кода вполне достаточно, впоследствии от этого класса мне потребуется получить чуть больше возможностей, разработку которых я покажу на конкретном этапе проектирования приложения. А пока мне необходимо протестировать уже имеющийся функционал. Для этого запускаю интерактивную сессию интерпретатора в терминале с активным виртуальным окружением этого web-приложения. Внимание на снимок экрана.

LEgG8l7DN0.png

Как видно на снимке экрана, в интерактивной сессии Python мне без труда удалось получить имена некоторых групп, по имени группы вполне не сложно получить её вес. Все операции умещаются в стандартные, определённые для работы с классами процедуры Питона. А это значит, что цель этой демонстрации достигнута, имея в пространстве имён класс groups, мне будет очень не сложно получать имена и вес необходимых мне групп на любом последующем этапе разработки, когда это потребуется.

Подводим промежуточный итог

В арсенале разрабатываемого web-приложения появился специальный класс, с помощью которого можно без труда получить имя определённой замыслом разработки группы и её вес. Впоследствии, в одном из следующих выпусков этого цикла, я покажу создание пользователей конкретных групп, именно тогда разработанный только что класс будет использован по назначению. Продолжение следует...

Напоминаю, что продолжение этого цикла статей возможно, только если в блоге будет активность. Ваши посещения, подписки, лайки, комментарии и донаты имеют большое значение и качественно мотивируют автора, заряжают его соответствующей жизненной силой. Не оставайтесь в стороне, будет интересно...