Главная/ Блог/ Casbin-ruby

Библиотека авторизации c поддержкой RBAC

May 2021

Casbin-ruby — библиотека авторизации, поддерживающая распределённое управление доступом на основе ролей (RBAC)

В нашем проекте для KFC мы используем микросервисную архитектуру с компонентами, написанными на разных языках программирования и в различных средах выполнения, таких как .NET, Ruby и Go. Многие из этих компонентов должны принимать решения на основе статуса авторизации пользователей: кто они, к каким ролям относятся, какие действия могут выполнять и для чего?

Нам нужен был способ использования RBAC, совместимый с несколькими независимыми языками и фреймворками, к тому же требовалось каким-то образом управлять правами и списками контроля доступа (ACL).

Обычно при разработке приложений с общими фреймворками на таких языках, как Ruby, Python, PHP или Go, управление доступом на основе ролей входит в состав фреймворка или поставляется в виде библиотеки, что позволяет его легко использовать. Но это не сработает, если приложение разрабатывается как часть крупной системы, которая не всегда использует один язык программирования, тем более одни и те же фреймворки.

Мы начали изучать возможные варианты. Один из подходов — использование централизованной службы, такой как брокер Keycloak, который позволяет управлять авторизацией для всех микросервисов. Но централизованный брокер становится единой точкой отказа и потенциально узким местом — это явный недостаток, особенно для высоконагруженных систем. Из-за любого сбоя преимущества распределённой микросервисной архитектуры будут мгновенно потеряны.

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

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

 

Как это работает?

Если коротко — каждый микросервис имеет доступ к двум файлам, которые распределены по системе. Первый содержит список пользователей, групп, ролей и тому подобное — он определяет принципы авторизации. Второй содержит соответствия между участниками, по сути — это слияние всех ACL, используемых системой.

Таким образом мы решили основную часть нашей задачи — получили децентрализованное (или распределённое) управление пользователями, их ролями и тем, что они могут делать.

Casbin позволяет:

  • применять политику в классической форме {subject, object, action} или в той, которую вы сами определяете. Можно как разрешить, так и запретить авторизацию;
  • обрабатывать хранилище модели контроля доступа и её политику;
  • управлять маппингом ролей и пользователей, а также сопоставлением ролей друг с другом, то есть иерархией ролей в RBAC.
  • поддерживать встроенного суперпользователя, такого, как root или administrator. Суперпользователь может без явных разрешений делать что угодно;
  • использовать несколько встроенных операторов для поддержки сопоставления правил. Например, keyMatch может сопоставить ключ ресурса /foo/bar с шаблоном /foo*.

Casbin не позволяет:

  • выполнять аутентификацию (проверку имени пользователя и пароля при входе пользователя в систему);
  • управлять списком пользователей или ролей. Этими сущностями удобнее управлять в самом проекте. Однако Casbin хранит соответствия между пользователями и ролями для сценария RBAC.

Установка Casbin-ruby

Последняя версия:

gem 'casbin-ruby', github: 'CasbinRuby/casbin-ruby'

Конкретная версия:

gem 'casbin-ruby', '1.0.5'

Что дальше?

Нам потребовалось около месяца на разработку Ruby-реализации для Casbin. Благодаря готовым тестам из существующих библиотек на других языках у нас изначально было глубокое покрытие тестами, и мы продолжили разработку, применяя подход TDD-first (разработка через тестирование).

Сейчас от разработки базовой реализации Ruby мы переходим к написанию хранилищ и менеджеров оповещений. Мы планируем разработать интеграцию в существующие менеджеры ролей, а также собираемся добавить поддержку для различных фреймворков Ruby: Ruby on Rails, Hanami и Roda.

Библиотека Casbin-Ruby доступна на Github, а о самой Casbin вы сможете больше узнать на её веб-сайте.

Сasbin — мощная и эффективная библиотека контроля доступа с открытым исходным кодом для Ruby-проектов. Она обеспечивает поддержку принудительной авторизации на основе различных моделей управления доступом. Дайте знать, если у вас есть какие-либо проблемы или пожелания по функциям.  Pull request'ы приветствуются!
Александр Кириллов
CTO Evrone
Будем на связи
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.