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

Spring Аутентификация маркера безопасности - служба RESTful JSON

Я ищу использовать Spring Безопасность для приложения Spring MVC, которое будет строго служить веб-службой JSON. Я провел некоторое исследование и прочитал несколько статей, но на самом деле ничего не нашел. Я хочу, чтобы приложение было полностью без атак и использовало аутентификацию на основе токенов. Я не хочу, чтобы приложение Spring MVC имело какие-либо формы или использовало формы для аутентификации. Он должен строго принимать запросы и данные в JSON и возвращать ответы JSON.

Будет создано клиентское приложение Angular JS, которое должно будет отправить имя пользователя и пароль и получить токен из приложения, которое будет использоваться в последовательных запросах. В какой-то момент могут появиться клиенты Android, которые также обращаются к этому веб-сервису.

Я предполагаю, что Spring Безопасность имеет свой внутренний путь для сопоставления токена с пользовательским сеансом, то есть он знает маркер XXXXXXXXXXXX - пользователь admin и маркер AAAAAAAAAA является стандартным пользователем Joe. Однако у меня нет большого опыта работы с Spring Security, поэтому я не знаю, как все это происходит. Я все еще хочу иметь возможность использовать защищенные аннотации для контроллеров и методов обслуживания.

Есть ли способ выполнить это в Spring безопасности?

Этот вопрос кажется хорошим местом для начала, но я не уверен, что это сработает, поскольку я предусмотрел его RESTful Authentication через Spring.

4b9b3361

Ответ 1

Это будет хорошее место, чтобы начать с Spring-Rest-Boilerplate.

  • Впервые вам нужно использовать http basic authentication и затем войдите в систему (отправьте имя пользователя/пароль), и это вернет токен.
  • В следующем запросе вы будете использовать этот токен для аутентификации.
  • Вам нужно будет добавить фильтр в цепочку, которая будет делать это аутентификация на основе токена.

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

Изменить. Как указывает Maciej Stępyra MD5, кажется, что он сломан, и ему рекомендуется использовать более сильные хэш-функции, такие как SHA-256.

Spring по умолчанию будет перенаправлять вас на страницу входа, но это не имеет смысла в случае REST, поэтому используйте настраиваемый AuthenticationEntryPoint в config (Ref sample github code).

Я использовал этот формат для своего токена: token:username:hash:expiry

хэш = MD5 (имя пользователя + MagicKey)

экспирации = CURRENT_TIMESTAMP + mins_to_expiry

 <security:http realm="Protected API" use-expressions="true" auto-config="false" create-session="always" entry-point-ref="**CustomAuthenticationEntryPoint**">
        <security:custom-filter ref="**authenticationTokenProcessingFilter**" position="PRE_AUTH_FILTER" />
        <security:intercept-url pattern="/**" access="isAuthenticated()" />
 </security:http>

NB: Спасибо dhavaln за код. Я использовал это как ссылку и разработал аналогичную вещь.

Ответ 2

"Я хочу, чтобы приложение было полностью без гражданства"

Я бы пересмотрел то, что вы пытаетесь сделать. Там есть причина, по которой вы не можете найти хорошие примеры своего решения: у вас просто не может быть приложения, которое является как апатридом, так и безопасным. Кроме того, если вы где-то храните маркеры, вы не являетесь апатридом. Даже если вы не храните токены (например, используя JWT для их кодирования), вам необходимо защитить от атак CSRF, если пользователи получат доступ к этому в веб-браузере. Если вы идете по своему маршруту, ожидайте написания большого количества настраиваемого кода безопасности (что плохо). См. Обсуждение этого здесь: https://spring.io/blog/2015/01/12/the-login-page-angular-js-and-spring-security-part-ii

Ответ 3

В моем случае мне было проще заменить org.springframework.security.web.context.SecurityContextRepository в org.springframework.security.web.context.SecurityContextPersistenceFilter на реализацию, которая разделяет SecurityContext среди нескольких узлов tomcat. Клиент продолжает отправлять маркер jsessionid-like, но я могу сделать простую балансировку нагрузки по кругу и не должен беспокоиться о репликации сеанса.