Несколько дней назад некоторые из моих коллег обратились ко мне по поводу проблемы с приложением с открытым исходным кодом под названием Makaut Buddy , которое представляет собой платформу для обмена заметками, разработанную для нашего университета и призванную помочь студентам эффективно обмениваться главными заметками, вопросами прошлых экзаменов и обучающими материалами на YouTube. .
Хотя они успешно разработали систему загрузки ресурсов, они столкнулись с проблемой обеспечения того, чтобы только авторизованные лица могли загружать контент.
Как показано в демо ниже, любой пользователь может создать ресурс после регистрации. Это представляло собой большую проблему, поскольку мы не могли регулировать то, что пользователи загружают, а некоторые даже могли загружать вредоносный или тревожный контент.
Первоначально они определили роль администратора и предоставили избранной группе лиц административные привилегии. Однако по мере увеличения количества ролей код становился все более сложным и трудным в управлении.
Именно тогда у меня возникла идея написать эту статью, чтобы повысить осведомленность об эффективных способах управления авторизацией с использованием модели управления доступом на основе ролей (RBAC) с помощью сторонних инструментов авторизации, таких как Permit.
Помимо внедрения RBAC, мы также внедрили систему подтверждения запроса на доступ. Эта система гарантирует, что любой пользователь, желающий загрузить контент, должен сначала запросить доступ, который администратор затем может одобрить или отклонить. Этот дополнительный уровень безопасности помогает нам поддерживать целостность контента на Makaut Buddy.
В этой статье я использовал JavaScript в качестве языка программирования и Next.js в качестве платформы. Однако обсуждаемые здесь концепции не зависят от языка, и вы можете реализовать их на предпочитаемом вами языке программирования.
К концу этой статьи вы научитесь реализовывать базовую модель RBAC в своем приложении.
С учетом вышесказанного, давайте погрузимся!
Помните те утренние спешки в школу? Охранник, проверяющий ваше удостоверение личности, является прекрасным примером аутентификации. Они проверяют вашу личность как студента, допущенного в кампус. Но это только первый шаг. Даже после того, как вас опознали, вы ведь не пойдете просто так в любой класс, верно? Вот тут-то и пригодится авторизация.
Воспринимайте расписание занятий как свое разрешение. Он предоставляет вам доступ к определенным областям (классам) в зависимости от вашей роли (учащегося, зачисленного в этот класс). Вам не будет разрешено войти в учительскую или в закрытую секцию библиотеки, даже если вы студент (аутентифицированный).
Разница между аутентификацией и авторизацией подобна вопросу «Кто вы?» против «Что вам разрешено делать?»
Авторизация важна в каждой организации, поскольку она не позволяет отдельным лицам выполнять действия, на которые у них нет разрешения. Это обеспечивает безопасность организации и помогает предотвратить потери.
Проиллюстрируем вышеизложенное утверждение примером:
В компании есть старшие инженеры с большим опытом, а также несколько стажеров, которые все еще учатся. Вы можете себе представить, какую катастрофу это могло бы вызвать, если бы и старший инженер, и стажер имели одинаковый уровень разрешений. Стажеры, которые еще учатся, могут по незнанию допустить ошибку, за которую компании придется расплачиваться. В подобных ситуациях модель управления доступом на основе ролей работает лучше всего, поскольку разрешения не назначаются отдельным лицам, а назначаются ролям. Например, только старший инженер или технический руководитель может удалять ресурсы, тогда как все стажеры могут только просматривать ресурсы и управлять ими.
Далее давайте посмотрим, как можно реализовать RBAC в приложении.
Во-первых, нам нужно определить роли и назначить разрешения для каждой роли.
Примечание. Роль — это должность или цель, которую кто-то имеет в организации. Нам нужны роли, чтобы мы могли различать людей на основе разрешений или привилегий, назначенных этой роли.
Нам нужен способ назначить роль каждому пользователю приложения. Обычно это делается после регистрации пользователя.
Нам нужен API в нашем бэкэнде, который принимает операцию, которую пользователь хочет выполнить, и проверяет авторизацию пользователя. Схема ниже поможет вам лучше понять:
Однако мы не собираемся реализовывать всю модель с нуля. Вместо этого мы собираемся использовать сторонний инструмент авторизации под названием Permit, который сделает для нас весь процесс авторизации очень простым и эффективным, так что вы сможете работать над действительно важными функциями.
На диаграмме ниже показано, как мы собираемся использовать Permit для реализации RBAC в наших приложениях:
В этом разделе мы рассмотрим шаги по реализации управления доступом на основе ролей (RBAC) с использованием разрешений.
Поскольку мы используем разрешение для создания модели RBAC, сначала нам нужно создать учетную запись разрешения и рабочую область:
Теперь нам нужно создать ресурс, который является объектом, доступ к которому мы хотим контролировать в нашем приложении.
Например, в приложении для создания заметок ресурсом будут «Заметки», а действиями — «Создать» , «Чтение», «Обновить» и «Удалить».
Чтобы создать ресурс:
В приведенном выше примере имя ресурса — «Заметки», а действия, которые пользователю разрешено выполнять — «Создать», «Чтение», «Обновить» и «Удалить».
После создания ресурса нам необходимо определить роли, которые будут существовать в нашем приложении.
В данном случае, поскольку приложение представляет собой приложение для обмена заметками для университета, роли будут следующими:
После того, как мы создали обе роли, нам нужно назначить действия, которые каждая роль может выполнять в нашем редакторе политик, как показано ниже:
Теперь, когда ваша учетная запись Permit настроена, вы можете приступить к созданию серверных API для взаимодействия с Permit. Мы будем использовать Node.js SDK, предоставленный Permit. Вы можете найти SDK для предпочитаемого вами языка программирования в разрешительной документации.
Синхронизировать пользователей и назначить роль по умолчанию
Во-первых, нам нужно убедиться, что каждый пользователь, регистрирующийся в нашем приложении, синхронизирован с каталогом разрешений и ему назначена роль Студента по умолчанию.
Для этого нам нужно создать серверный API, как показано ниже:
Этот API делает 2 вещи:
createUser
.assignRole
.
Подробнее обо всех API, предоставляемых Permit, можно прочитать в документации разрешений.
Получить роль пользователя
Далее нам нужно создать бэкэнд API, который получает роль пользователя из Permit.io и отправляет ее обратно во фронтенд.
API, показанный ниже, получает пользователя с помощью permit.api.users.get(user_key)
Этот API получает роль пользователя, с помощью которой мы можем манипулировать нашими интерфейсными компонентами, чтобы его могли видеть только люди, имеющие специальные роли.
Вы также можете проверить функцию Permit.check(), чтобы проверить, разрешено ли пользователю с определенной ролью выполнять операцию.
Благодаря этому мы успешно реализовали модель RBAC с использованием Permit. Теперь мы можем интегрировать внутренние маршруты с внешней платформой или библиотекой по вашему выбору для завершения настройки.
Чтобы завершить настройку, нам нужен компонент, который позволит пользователям запрашивать обновления ролей:
Элементы разрешений являются частью «Permit Share-If», который представляет собой набор готовых встраиваемых компонентов пользовательского интерфейса, которые упрощают совместное использование доступа в приложениях. Разработанные для обеспечения полнофункционального контроля доступа, они делают делегирование управления разрешениями вашим пользователям простым и безопасным.
Вот и все, мы создали элементы.
Прежде чем использовать элементы, нам необходимо создать серверный API для входа пользователя в элемент разрешения,
Примечание. Важно войти в систему как можно раньше, желательно сразу после регистрации.
Теперь давайте посмотрим на код:
Код API, обслуживающий конечную точку /api/v1/login_permit/?userkey=user_key
:
Код внешнего интерфейса для реализации входа в систему будет выглядеть следующим образом:
Вот и все, мы настроили наш код.
Теперь нам просто нужно перейти на панель разрешений и скопировать iframe управления пользователями и iframe запроса доступа, как показано ниже:
Теперь, когда у нас есть код, нам нужно добавить iframe
в наш интерфейс, где мы хотим показывать элементы нашим пользователям, нам нужно:
Благодаря этому мы успешно настроили систему утверждения доступа, в которой пользователи могут запрашивать повышение ролей, а администраторы могут утверждать или отклонять эти запросы.
В этой демонстрации показано, как пользователь с ролью «Администратор» может получить доступ к виджету загрузки.
В этой демонстрации показано, как пользователь с ролью «Студент» не может видеть виджет загрузки и может запросить обновление до роли «Администратор»:
В этой демонстрации показано, как привилегированные пользователи могут утверждать запросы на обновление роли:
В этой демонстрации показано, как пользователь после повышения уровня «Студент» до «Администратор» получает доступ к виджету загрузки.
Вот и все!
Спасибо, что дочитали до этого места.
В этом уроке мы рассмотрели авторизацию и поняли, почему авторизация очень важна в любом приложении. Мы также рассмотрели, как мы можем установить и настроить Permit для защиты приложения и контроля доступа пользователей в зависимости от их ролей.
Эта статья — лишь верхушка айсберга авторизации и модели RBAC. Вы можете изучить ABAC и ReBAC для более детальной авторизации.