x4zx
@x4zx
python developer

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

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

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

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

Попрошу читающих оставить свои идеи. Коммерческого опыта у меня нет, так что я не представляю как это реализовывается в каких-то компаниях. Но будет интересно почитать. Заранее спасибо.
  • Вопрос задан
  • 67 просмотров
Решения вопроса 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 и походы в БД за списком ролей и соответствием ролей эндпоинтам просто кэшировать. Обычно эндпоинтов и ролей не сотни, так что даже их комбинации много памяти не сожрут.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы