kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Chris Cashwell
Chris Cashwell
Вопрос

RESTful аутентификация через Spring

Проблема: У нас есть RESTful API на базе Spring MVC, который содержит конфиденциальную информацию. API должен быть защищен, однако отправка учетных данных пользователя (комбинация пользователь/пасс) при каждом запросе нежелательна. Согласно рекомендациям REST (и внутренним бизнес-требованиям), сервер должен оставаться без статических данных. API будет потребляться другим сервером в стиле mashup.

Требования:

  • Клиент делает запрос на .../authenticate (незащищенный URL) с учетными данными; сервер возвращает защищенный токен, который содержит достаточно информации для того, чтобы сервер мог подтверждать будущие запросы и оставаться без статического состояния. Скорее всего, он будет состоять из той же информации, что и Spring Security Remember-Me Token.

  • Клиент делает последующие запросы к различным (защищенным) URL, добавляя полученный ранее токен в качестве параметра запроса (или, что менее желательно, заголовка HTTP-запроса).

  • Нельзя ожидать, что клиент будет хранить файлы cookie.

  • Поскольку мы уже используем Spring, решение должно использовать Spring Security.

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

Учитывая описанный выше сценарий, как вы могли бы решить эту конкретную задачу?

252 2012-05-31T01:16:16+00:00 4
PraveenKumar Lalasangi
PraveenKumar Lalasangi
Редактировал вопрос 3-го октября 2019 в 6:16
Программирование
rest
java
spring
spring-mvc
spring-security
Решение / Ответ
Chris Cashwell
Chris Cashwell
2-го июня 2012 в 4:33
2012-06-02T16:33:25+00:00
Дополнительно
Источник
Редактировать
#16319156

Нам удалось заставить его работать именно так, как описано в OP, и мы надеемся, что кто-то еще сможет воспользоваться этим решением. Вот что мы сделали:

Настройте контекст безопасности следующим образом:

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

<bean id="CustomAuthenticationEntryPoint"
    class="com.demo.api.support.spring.CustomAuthenticationEntryPoint" />

<bean id="authenticationTokenProcessingFilter"
    class="com.demo.api.support.spring.AuthenticationTokenProcessingFilter"   >
    <constructor-arg ref="authenticationManager" />
</bean>

Как вы можете видеть, мы создали пользовательскую AuthenticationEntryPoint, которая в основном просто возвращает 401 Unauthorized, если запрос не был аутентифицирован в цепочке фильтров нашим AuthenticationTokenProcessingFilter.

CustomAuthenticationEntryPoint:

public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException authException) throws IOException, ServletException {
        response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: Authentication token was either missing or invalid." );
    }
}

AuthenticationTokenProcessingFilter:

public class AuthenticationTokenProcessingFilter extends GenericFilterBean {

    @Autowired UserService userService;
    @Autowired TokenUtils tokenUtils;
    AuthenticationManager authManager;

    public AuthenticationTokenProcessingFilter(AuthenticationManager authManager) {
        this.authManager = authManager;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        @SuppressWarnings("unchecked")
        Map<String, String[]> parms = request.getParameterMap();

        if(parms.containsKey("token")) {
            String token = parms.get("token")[0]; // grab the first "token" parameter

            // validate the token
            if (tokenUtils.validate(token)) {
                // determine the user based on the (already validated) token
                UserDetails userDetails = tokenUtils.getUserFromToken(token);
                // build an Authentication object with the user's info
                UsernamePasswordAuthenticationToken authentication = 
                        new UsernamePasswordAuthenticationToken(userDetails.getUsername(), userDetails.getPassword());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails((HttpServletRequest) request));
                // set the authentication into the SecurityContext
                SecurityContextHolder.getContext().setAuthentication(authManager.authenticate(authentication));         
            }
        }
        // continue thru the filter chain
        chain.doFilter(request, response);
    }
}

Очевидно, что TokenUtils содержит некоторый секретный (и очень специфичный для конкретного случая) код и не может быть легко разделен. Вот его интерфейс:

public interface TokenUtils {
    String getToken(UserDetails userDetails);
    String getToken(UserDetails userDetails, Long expiration);
    boolean validate(String token);
    UserDetails getUserFromToken(String token);
}

Это должно помочь вам начать. Счастливого кодирования. :)

 bluish
bluish
Редактировал ответ 8-го января 2015 в 5:25
182
0
Tim Pote
Tim Pote
31-го мая 2012 в 2:43
2012-05-31T02:43:21+00:00
Дополнительно
Источник
Редактировать
#16319155

Вы можете рассмотреть вариант Digest Access Authentication. По сути, протокол выглядит следующим образом:

  1. Делается запрос от клиента
  2. Сервер отвечает уникальной строкой nonce
  3. Клиент предоставляет имя пользователя и пароль (и некоторые другие значения), хэшированные md5 с помощью nonce; этот хэш известен как HA1
  4. После этого сервер может проверить личность клиента и предоставить запрашиваемые материалы
  5. Общение с использованием nonce может продолжаться до тех пор, пока сервер не предоставит новый nonce (счетчик используется для устранения атак повторного воспроизведения)

Вся эта коммуникация осуществляется через заголовки, что, как отмечает jmort253, обычно более безопасно, чем передача конфиденциального материала в параметрах url.

Digest Access Authentication поддерживается Spring Security. Обратите внимание, что, хотя в документации говорится, что вы должны иметь доступ к паролю вашего клиента, вы можете успешно пройти аутентификацию, если у вас есть хэш HA1 для вашего клиента.

Tim Pote
Tim Pote
Редактировал ответ 31-го мая 2012 в 2:57
24
0
Leif John
Leif John
28-го марта 2016 в 10:01
2016-03-28T10:01:28+00:00
Дополнительно
Источник
Редактировать
#16319157

Что касается токенов, несущих информацию, то JSON Web Tokens (http://jwt.io) - это блестящая технология. Основная концепция заключается во внедрении информационных элементов (утверждений) в токен, а затем подписании всего токена, чтобы проверяющая сторона могла убедиться, что утверждения действительно заслуживают доверия.

Я использую эту реализацию на Java: https://bitbucket.org/b_c/jose4j/wiki/Home

Существует также модуль Spring (spring-security-jwt), но я не изучал, что он поддерживает.

4
0
vaquar khan
vaquar khan
24-го июля 2017 в 4:43
2017-07-24T04:43:04+00:00
Дополнительно
Источник
Редактировать
#16319158

Почему Дон'т вы начинаете с помощью OAuth с JSON WebTokens

http://projects.spring.io/spring-security-oauth/

OAuth2-это открытый стандартный протокол авторизации/рамки. Согласно официальной что OAuth2 спецификация:

Вы можете найти более подробную информацию здесь

1
0
Похожие сообщества 32
pro.jvm
pro.jvm
5 817 пользователей
Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Открыть telegram
learn.java
learn.java
5 372 пользователей
Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat
Открыть telegram
Java & Co
Java & Co
4 432 пользователей
Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/179171 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude
Открыть telegram
secinfosec
secinfosec
3 403 пользователей
Эта настоящая группа про информационную безопасность. Мы: пентестеры, ресерчеры, ибшники, всякие органы. Говорим об и по ИБ. Реклама, криминал, оскорбления, политика, и всякая ересь запрещены. По APT: @aptleak Канал @secinfosex
Открыть telegram
IBM QRadar
IBM QRadar
3 095 пользователей
IBM QRadar SIEM group
Открыть telegram
RUSCADASEC community: Кибербезопасность АСУ ТП
RUSCADASEC community: Кибербезопасность АСУ ТП
3 001 пользователей
The Industrial Cybersecurity Community est. 2015 www.ruscadasec.com info@ruscadasec.com Chat user commands: #offtop /offtop - offtop warning #spam /spam - report spam #rules /rules - rules warning
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 17 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
ES
ID
JA
KO
RO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией