Подтвердить что ты не робот

Как создать систему аутентификации и авторизации для REST backend/Ajax front End Application

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

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

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

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

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

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

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

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

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

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

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

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

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

Вариант 6: Внедрить собственный протокол аутентификации/авторизации

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Я использовал 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, когда один из них будет вызван, Я отправил служебный ключ в качестве actee, чтобы проверить, имеет ли текущий пользователь достаточный контроль доступа для этого. и для аудита вы должны контролировать все запросы, я имею в виду, что вы должны использовать слушателя в своем шлюзе или брокере...