Аутентификация стека MERN и авторизация - PullRequest
0 голосов
/ 27 июня 2019

Я создаю приложение стека MERN (Mongo, Express, React-redux, Node), в которое добавляю функции аутентификации, авторизации и контроля доступа.Я знаю, как реализовать службу аутентификации, но не знаю, как реализовать авторизацию и контроль доступа.Например: когда пользователь войдет в систему, он сможет создавать, редактировать и удалять задачи на своей панели, и никто не сможет увидеть или отредактировать это.Как я могу это реализовать?Любые ссылки, код или помощь будет высоко ценится.Большое спасибо!

1 Ответ

0 голосов
/ 02 июля 2019

Это отличный вопрос.И ответ длинный :-) Я только что ответил на похожий вопрос здесь, чтобы вы могли начать читать это .

TL; DR

То, что вы ищете, этоназывается внешним / динамическим управлением авторизацией.Формальная модель называется управлением доступом на основе атрибутов ( / Wikipedia ).Он был официально оформлен Институтом стандартов и технологий (NIST).

Подробнее

Вы заявили:

Когда пользователь войдет в систему, он сможет создавать, редактировать и удалять задачи на своей панели инструментов, и никто не сможет просматривать или редактировать это.

Вам необходимо написать политику, используя атрибуты, которые позволятпользователи делают такие вещи и мешают им делать другие вещи.Если мы переписываем ваше требование, оно становится:

  • Пользователь может создавать, редактировать и удалять элементы TODO на принадлежащей ему панели управления.
  • Никто не может видеть элементы на панели управления.им не принадлежит.

Глядя на требования, вы понимаете, что у вас есть:

  • субъект (или пользователь) с его атрибутами (например, роль, отдел ...))
  • действие (например, просмотр, редактирование, удаление ...)
  • объект или ресурс (элемент "TODO") и его контейнер (панель инструментов).

Это означает, что вы можете начать переписывать свои требования с точки зрения атрибутов.Это становится:

  • A user can do action == "view" on object of type == "TODO" if user.username == object.dashboard.owner

Затем можно добавить:

  • deny all access if object.dashboard.owner != user.username

Язык для написания таких политик называется ALFA ( / Wikipedia , сокращенный язык для авторизации. Это стандарт, определенный OASIS XACML .

После того, как вы определили свои политики, вам нужно будет развернуть их, запустить и применить их. Вот где архитектура ABAC начинает действовать:

  • Точка администрирования политики (PAP):где написаны политики
  • Точка принятия решения о политике (PDP): где политики запускаются / выполняются
  • Точка применения политики (PEP): где применяются политики - это может быть шлюз API, перехватчик...
  • Точка информации о политике (PIP): где можно получить дополнительные метаданные и атрибуты

The Attribute-Based Access Control (ABAC) Architecture

Вопросзатем становится: где вы хотите применить? Как выглядит ваша архитектура MERN?t авторизовать:

  • в веб-интерфейсе?(функциональный authZ)
  • на уровне API (транзакционный authZ)
  • на уровне данных (ориентированный на данные authZ / filtering)

Например, выхотите отфильтровать данные из MongoDB и показывать только разрешенные результаты?Хотите применить авторизацию на уровне API?Шлюзы API (например, Kong) могут помочь вам достичь этого с помощью плагинов авторизации, например, Axiomatics-Kong .

Существуют реализации с открытым исходным кодом, коммерческие реализации ABAC и орган стандартизации (я являюсьредактор некоторых спецификаций, таких как запрос / ответ JSON / REST) ​​

...