Как спроектировать систему аутентификации и авторизации для внешнего интерфейса REST / Ajax - PullRequest
26 голосов
/ 13 февраля 2011

Я начинаю новый проект, в котором мы планируем создать спокойный сервер и конец шрифта AJAX.Я подхожу к этой проблеме, сосредоточив внимание на идентификации всех ресурсов, которые у меня есть, и на что они будут направлены различными глаголами HTTP, их URI и представления этих ресурсов в JSON.

Я ищу лучший дизайн для крепления бэкэнда.Вот список конструкций, которые я рассмотрел.Я ищу альтернативные проекты, не перечисленные ниже, и плюсы, минусы, рекомендации.Система будет реализована с использованием Spring 3.0 и, возможно, Spring Security 3.0, SSL будет использоваться для многих частей системы, но не для всех, поэтому некоторые запросы могут поступать по SSL, а некоторые - нет.

Вариант 1. Использование сеанса HTTP

Показать стандартный экран входа в систему, создать сеанс на стороне сервера и позволить tomcat отправить обратно файл cookie jsessionid, а клиент ajax должен включать файл cookie JSESSIONID в каждый XHRзапрос.Эти параметры просто кажутся неправильными по следующим причинам.

  • Соединение становится полным, что противоречит правилам REST
  • Я хочу иметь возможность разбить bakcend на несколько отдельных файлов WAR, что означает, что я могу иметь несколько сеансов HTTP набэкэнд, если это так, то этот подход не работает.Хотя сегодня мне не нужна возможность разбивать серверную часть на несколько приложений, я бы предпочел конструкцию, которая допускает такую ​​возможность.

Вариант 2. Найдите библиотеку безопасности с открытым исходным кодом на основе Java, которая делаетthis

Кроме Spring Spring, я не нашел никаких других библиотек Java, любые рекомендации высоко ценятся.

Вариант 3: Попробуйте использовать существующий протокол, такой как OAuth

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

Вариант 4. Использование SAML и Shiboleth

Этот параметр кажется слишком сложным и чрезвычайно сложным в настройке и обслуживании.

Вариант 5: отправлять имя пользователя и пароль при каждом запросе

Для этого требуется, чтобы пользователь отправлял свое имя пользователя и пароль при каждом запросе, что означает, что внешнее приложение AJAX должно хранить имя пользователя и паролькак объект JavaScript, и если пользователь уходит со страницы, то назад комбинация имени пользователя и пароля исчезнет, ​​и пользователь может быть вынужден снова войти в систему.Я не хочу, чтобы клиентская часть пыталась вставить имя пользователя и пароль в cookie, поскольку это означало бы безопасность.

Вариант 6: Реализация собственного протокола аутентификации / авторизации

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

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

Я уверен, что я не единственный, кто борется с этой проблемой, я надеюсьсообщество по переполнению стека может указать на некоторые опции и инструменты, которые я еще не нашел.

Ответы [ 3 ]

11 голосов
/ 13 февраля 2011

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

Или вы можете использовать Spring Security (или Shiro) с файлом cookie Запомнить меня, который используется в веб-приложениях (если они находятся в одном и том же домене HTTP). Файл cookie Запомнить меня будет аналогичен вашему токену в варианте 6. Вы можете установить срок действия куки, чтобы он был недолговечным, как сеансовый куки, или долгим, как обычный, помните меня.

1 голос
/ 20 мая 2011

Возможно, вы также захотите взглянуть на Jasig CAS - единый вход в Интернет. Он имеет REST API и протокол (Proxy Tickets), который позволяет сервисам прокси-пользователя AuthN выполнять внутренние сервисы, как вы описали в варианте 6. http://www.jasig.org/cas

Вкратце ... приложение, которое обслуживает AJAX-клиента, защищено Spring Security (поддерживает CAS из коробки) и получает Proxy Granting Ticket, который вы встраиваете в AJAX-клиент. Клиент AJAX использует PGT для получения прокси-билетов для ваших служб REST ... также защищенных Spring Security. Службы REST получают аутентифицированный идентификатор пользователя без каждого касающегося основных учетных данных.

В качестве альтернативы вы можете оставить PGT на сервере и использовать вызовы AJAX для получения прокси-билетов, которые затем используются клиентом AJAX для вызова служб REST.

0 голосов
/ 12 июля 2016

Как я понял, вы собираетесь защитить приложение для отдыха, чтобы предисловие, вы должны знать, что поставщик безопасности состоит из трех понятий (3A): -Аутентификация -Authorization -Auditing

, чтобы реализовать эти три вместе, вы должны предоставить множество инструментов, таких как: -ССО провайдер -Сессионный магазин -Открытый идентификатор интеграция учетных данных ....

Я использовал ACL (Spring ACL) для предоставления услуг авторизации и oauth2 для аутентификации. есть один канал для соединения этих двух вместе и его областей (области oauth2), но проблема в том, что области не достаточно гибки (чистые строки) для реализации модулей авторизации, таких как role_voter, cache_strategy, black_list или, стратегия Role_base, исключительные разрешения, white_list. .. (но вы можете использовать @EnableGlobalMethodSecurity)

В моем случае я использовал сервер авторизации в качестве ресурса для сервера аутентификации oauth2 (взгляните на http://projects.spring.io/spring-security-oauth/docs/oauth2.html),, затем я рассмотрел два места для проверки авторизации: первый я выдал ACL для внешнего интерфейса и заставил программиста динамически разрабатывать ее страницу в соответствии с концепцией ACL, вторая находится в бэк-энде на служебном уровне (BLL), используя Aspect, когда будет вызываться одна остановка. Я отправил служебный ключ в качестве акта, чтобы проверить, имеет ли текущий пользователь достаточный контроль доступа для этого. и для аудита вы должны отслеживать все запросы, я имею в виду, что вы должны использовать прослушиватель в вашем шлюзе или брокере ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...