x4zx
@x4zx
python developer

Как спроектировать систему прав для сайта?

Заранее извиняюсь если использовал не тот тег. Не знаю какой лучше всего подходит к моему вопросу. Буду благодарен за правки.

Суть вопроса состоит в следующем:
Я разрабатываю в комбинации FastAPI + React.js. Застрял на момент авторизации и проверки прав пользователя. На моём сайте авторизация проходит через Discord Oauth2 - в конечном итоге после авторизации на фронт приходит jwt токен с помощью которого и взаимодействуем. Но хотелось бы реализовать подобную систему как в самом Discord, то есть динамически и с помощью числового кода проверять права пользователя. Допустим - в админке отключил возможность оставлять комментарии для конкретного пользователя и на фронте это сразу же отобразилось. Что-то в таком роде.

У меня было парочка возможных решений.
1. При создании JWT токена встраивать в него числовой код прав и потом его проверять, но с таким методом пропадает динамичность.
2. При каждом запросе - обращаться к базе данных с проверкой наличия необходимых прав. Условно в объекте пользователя будет храниться словарик permission и хранить ключ:значение => {ADD_SERVER: 0 или False}. Но тут тоже возникают вопросы, особенно в ресурсозатратности и стоит ли оно вообще того.

Попрошу читающих оставить свои идеи. Коммерческого опыта у меня нет, так что я не представляю как это реализовывается в каких-то компаниях. Но будет интересно почитать. Заранее спасибо.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
Daemon23RUS
@Daemon23RUS
У меня был похожий по функционалу кейс, решил его комбинацией Того, что Вы рассматриваете.
в JWT маска прав, в redis оверрайд этих прав с TTL чуть больше чем TTL JWT.
Клиет получает JWT с маской прав, по окончании срока жизни JWT он обновляется с новой маской, а если в промежутке возникли изменения они вносятся в редис со сроком жизни чуть больше чем JWT.
Ответ написан
Комментировать
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Никогда не писал на FastAPI, но наверняка в нём подходы не сильно отличаются от любых других фреймворков. Можно добавить в токен список ролей пользователя на момент выдачи токена, а проверку ролей сделать декоратором на обработчиках запросов, типа

@app.get("/some/endpoint")
@has_role("some-role")
def some_handler(...):
    ...

Если хочется динамически менять роли на эндпоинте, то можно проверку делать в какой-нибудь там middleware и походы в БД за списком ролей и соответствием ролей эндпоинтам просто кэшировать. Обычно эндпоинтов и ролей не сотни, так что даже их комбинации много памяти не сожрут.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы