Перейти к основному контенту

· 6 мин прочитано
Rushikesh Tote

Введение

APISIX это высокая производительность и масштабируемый облачный шлюз API, основанный на Nginx и т.д.. Это проект с открытым исходным кодом от Apache Software Foundation. Кроме того, что делает APISIX настолько хорошим является поддержка многих больших встроенных плагинов, которые могли бы быть использованы для реализации функций, таких как аутентификация, мониторинг, маршрутизация и т.д. И тот факт, что плагины в APISIX перезагружены (без перезагрузки) делает это очень динамичным.

Но при использовании APISIX могут быть сценарии, где вы можете добавить сложную логику авторизации в вашем приложении. Вот где authz-casbin может вам помочь, authz-casbin - это APISIX плагин, основанный на Lua Casbin , который обеспечивает мощную авторизацию на основе различных моделей управления доступом. Casbin - это библиотека авторизации, поддерживающая такие модели управления доступом, как ACL, RBAC, ABAC. Первоначально написано в Го, он был портирован на многие языки, а Луа Касбин является Луа реализации Casbin. Разработка authz-casbin началась, когда мы предложили новый плагин для авторизации в хранилище APISIX (#4674), с которым согласились основные участники. А после полезных отзывов, которые привели к значительным изменениям и улучшениям, PR (#4710) наконец был объединен.

В этом блоге, мы будем использовать плагин authz-casbin для того, чтобы показать, как можно реализовать модель авторизации на основе контроля доступа на основе ролей (RBAC) в APISIX.

ПРИМЕЧАНИЕ: Вам нужно будет использовать некоторые другие плагины или пользовательский рабочий процесс для аутентификации пользователя, поскольку Касбин будет делать авторизацию только и не аутентификацию.

Создание модели

Плагин использует три параметра для авторизации любого запроса - тема, объект и действие. Здесь тема является значением заголовка имени пользователя, который может быть что-то вроде [username: alice]. Затем объект - это путь к URL, к которому он доступен, и используется метод запроса запроса.

Скажем, мы хотим создать модель с тремя ресурсами на путях - /, /res1 и /res2. И мы хотим иметь такую модель:

изображение

Это означает, что все пользователи (*), например Джек могут получить доступ к домашней странице (/). А пользователи с правами администратора , такими как alice и bob могут получить доступ ко всем страницам и ресурсам (например, res1 и res2). Кроме того, давайте ограничим пользователей без прав администратора использовать только GET метод запроса. Для этого сценария мы можем определить модель:

[request_definition]
r = sub, obj, действовать

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = где-то (стр. ft == allow))

[matchers]
м = (g(r.sub, p.sub) || keyMatch(r.sub, p. ub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)

Создание политики

В соответствии с вышеупомянутым сценарием политика будет заключаться в следующем:

p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob, admin

Матчер из модели означает:

  1. (g(r.sub, p.sub) || keyMatch(r.sub, p. ub)): Тема запроса имеет роль в качестве темы политики или тема запроса совпадает с темой политики keyMatch. keyMatch построен в функции Lua Casbin, вы можете посмотреть описание функции и другие функции, которые могут быть полезны здесь.
  2. keyMatch(r.obj, p.obj): Объект запроса соответствует объекту политики (путь к URL здесь).
  3. keyMatch(r.act, p.act): Действие запроса соответствует действию политики (метод HTTP запроса здесь).

Включение плагина на маршрут

Создав модель и политику, вы можете включить ее на маршруте с помощью APISIX Admin API. Чтобы включить его, используя пути файлов моделей и политики:

curl http://127.0.0. :9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"authz-casbin": {
"model_path": "/path/to/model. onf",
"policy_path": "/path/to/policy. sv",
"username": "username"
}
},
"upstream": {
"nodes": {
"127. .0.1:1980": 1
},
"type": "roundrobin"
},
"uri": "/*"
}'

Здесь имя пользователя - это имя заголовка, которое вы будете использовать для передачи в теме. Например, если вы будете передавать заголовок имени пользователя как пользователя: alice, вы бы использовали "username": "user".

Для использования текста модели/политики вместо файлов можно использовать модель и политику поля:

curl http://127.0.0. :9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"authz-casbin": {
"model": "[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, действовать

[role_definition]
g = _, _

[policy_effect]
e = где-то (стр. f== допустить))

[matchers]
м = (g(r. ub, p. ub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p. ct)",

"policy": "p, *, /, GET
p, admin, *, *
g, угла, администратора
g, bob, администратор",

"Имя пользователя": "Имя пользователя"
}
},
"upstream": {
"nodes": {
"127. .0.1:1980": 1
},
"type": "roundrobin"
},
"uri": "/*"
}'

Включение плагина с использованием глобальной модели/политики

Могут возникнуть ситуации, когда вы можете захотеть использовать одну модель и конфигурацию политики для нескольких маршрутов. Вы можете сделать это, отправив запрос PUT для добавления модели и конфигурации политики к метаданным плагина:

curl http://127.0.0. :9080/apisix/admin/plugin_metadata/authz-casbin -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -X PUT -d '
{
"model": "[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = где-то (стр. ft == allow))

[matchers]
м = (g(r.sub, p.sub) || keyMatch(r. ub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r. ct, p.act)",

"policy": "p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob, admin"
}'

Затем чтобы включить одну и ту же конфигурацию на некоторых маршрутах, отправьте запрос, используя админ-API:

curl http://127.0.0. :9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"authz-casbin": {
"username": "username"
}
},
"upstream": {
"nodes": {
"127. .0.1:1980": 1
},
"type": "roundrobin"
},
"uri": "/route1/*"
}'

Это добавит конфигурацию метаданных плагина в маршрут. Вы также можете легко обновить конфигурацию метаданных плагина, переслав запрос к метаданным плагина с обновленной моделью и конфигурацией политики, плагин автоматически обновит все маршруты, используя метаданные плагина.

Варианты использования

  • Основным вариантом использования этого плагина будет внедрение авторизации в ваших API. Вы можете легко добавить этот плагин на любой API маршрут, который используется с вашей моделью авторизации и конфигурацией политики.
  • Если вы хотите иметь одну модель авторизации для всех ваших API, вы можете использовать глобальный метод модели/политики. Это делает обновление политики простыми для всех маршрутов, так как вам нужно обновить только метаданные в и т.д.
  • Если вы хотите использовать другую модель для каждого маршрута, вы можете использовать метод маршрута. Это полезно, когда различные маршруты API имеют различные наборы прав пользователей. Вы также можете использовать это при работе с большими правилами, так как это сделает авторизацию быстрее, если отфильтровать по нескольким маршрутам.

· Один мин чтения
Casbin

Сегодня мы рады сообщить, что основатель Casbin'а Yang Luo стал лауреатом премии "Google Open Source Peer Bonus winners" за работу над Casbin, Npcap и Nmap в 2019 К3.

ospb

С оригинальным письмом о награждении можно ознакомиться здесь.

Google Open Source Peer Bonus программа описывается как:

Аналогичным образом, что Google Peer Bonus используется для распознавания соотечественника Googler, который ушел выше и дальше, Бонус с открытым исходным кодом (Open Source Peer Bonus - бонус) позволяет узнать о внешних людях, внесших исключительный вклад в работу с открытым исходным кодом.

объявление для победителей 2019 года доступно по адресу:

https://opensource.googleblog.com/2020/01/announcing-2019-second-cycle-google.html

Янг и Касбин перечислены среди разработчиков с открытым исходным кодом и проектов, которые оказывают там соответствующее влияние. как Git, TensorFlow, V8, CPython, LLVM, Apache проектов, Angular или Jenkins.

Мы рады видеть, что Касбин признан таким образом за его вклад в обеспечение открытого исходного кода и безопасности облака!

Спасибо за полёт!

· Один мин чтения
Yang Luo

Сегодня мы мигрировали документацию Casbin'а из GitHub в документацию этого веб-сайта, которая основана на Docusaurus. Docusaurus предоставляет множество потрясающих возможностей, таких как лучшие стили Markdown, полнотекстовый поиск, версия, перевод.

Документация еще не идеально и все еще нуждается в настройке. Исходный код выпущен на GitHub: https://github.com/casbin/casbin-website-v2.

Любой вклад или предложение приветствуются!

· Один мин чтения
Zixuan Liu

Сегодня мы успешно портировали Casbin в Node.js, который называется node-Casbin.

node-Casbin разделяет аналогичное использование и API с другими реализациями Casbin. middlewares for Express, Koa2 and Egg.js готовы к использованию . Подготовлен адаптер для последовательности памяти.

Надеемся, что он будет хорошо обслуживать вашу потребность :)

GitHub: https://github.com/casbin/node-casbin

· Один мин чтения
Хелонг Чжан

Некоторые из наших клиентов спрашивают можно ли Касбин использовать в качестве службы вместо библиотеки. Ответ ДА. Сегодня мы запустили проект Casbin Server в качестве конкретного решения для Контроля доступа в качестве Сервиса.

Casbin Server находится в активной разработке нашей основной команды. У него есть несколько особенностей:

  • Полностью развито на Голанге.
  • Можно управлять тысячами экземпляров Касбин, так что вы можете перенести логику политики из нескольких служб в один сервер Casbin.
  • gRPC используется для общения с Casbin Server. Мы также рассмотрим возможность добавления поддержки RESTful в ближайшее время.
  • Удобный администраторский портал предназначен для неразработчиков и администраторов для управления всеми деталями, такими как экземпляры касбин, модели, хранение политики и балансировка нагрузки.

Исходный код размещен на GitHub: https://github.com/casbin/casbin-server

Приветствуются любые вопросы или Pull Request'ы :)