Pull to refresh

Сервис с ролями и доступами на языке Golang без внешних пакетов

Для написания сервиса с пользователями у которых разные позиции и соответственно роли, понадобилось изучить систему распределения ролей по Casbin. В рамках изученной документации был выбран методика RBAC (более подробно можете читать в документации Casbin). Для этого в гитхабе есть пакет от Касбина, но он мне не понравился и сейчас я всё объясню. Пакет от касбина для языка Go использует мепки для временного харнения доступов, что дублирует код. Помимо этого реализация самого пакета немного делает систему статичной, что не очень хорошо в условиях сервисной архитектуры. По этим причинам мне пришлось отказаться от пакета. Возможно вам, читатель, понравится пакет, обязательно ознакомьтесь для полноты картины.

Вернёмся к нашему сервису. При регистрации пользователей, нужно присвоить им какую-нибудь роль, для разграничения доступа к сервису. В моём случае наилучшим вариантом стал метод RBAC - где доступ к системе ограничен на уровне роли, а не должности. Метод распределяет доступ к системе в рамках ролей. А роли в свою очередь состоять из сущностей. У нас есть три сущности:

  1. Субъект (пользователь)

  2. Объект (роут)

  3. Действие

Для нас все эти сущности объединены одним понятием - "Роль". Субъект у нас есть - это наши конечные пользователи. Объекты у нас наши роуты, которых может быть очень много, но для того, чтобы удобно распределять доступ, их нужно сгруппировать, например:

Роуты для работы с платежами - "/payments"

и создал таблицу где фиксирую все группы роутов:

  1. /payments Операции с плаетжами

  2. /users

  3. /operations

Теперь для каждой группы роутов соответствуют следующие действия:

  1. Создать, добавить (POST)

  2. Изменить, редактировать(PUT, PATCH)

  3. Просмотр, читать (GET)

  4. Удалить (DELETE)

Эти название действия у нас составляют третью сущность - Действие.

Теперь объединим всё и посмотрим как создаётся роль. Прежде чем регистрировать пользователя, мы должны создать роль для него. Создаем две таблицы:

1. Roles

2. Permissions

Каждая роль связана с доступом. Каждый доступ состоит из наборов «роут (объект) ‑ метод (действие)».

Например: Я создам роль пользователя, у которого есть доступ к платежам и только.

Теперь, когда регистрируем пользователя, ему сразу же присваиваем созданную роль - user. Каждый раз, когда он будет дергать какой-то роут, мы по его роли смотрим, есть ли у него данный роут с этим методом. Допустим пользователь хочет создать платёж, для этого он дергает роут - POST "/payments". Мы в свою очередь в рамках его роли проверяем, есть ли у него данный роут с данным методом. Если есть, то пропускаем и даём возможность создать платёж, если нет, то возвращаем ошибку. Всё это происходит на middleware. Таким образом, можно сколько угодно расширять диапазон, как действий, так и объектов и создать сколько угодно ролей с доступами. Очень простой но гибкий и надежный метод.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.