1

Мне нужно создать авторизацию с помощью службы oauth2. Мне нужно получить токен от него и использовать этот токен при доступе к ресурсам (службы REST). Как я могу это достичь? Что такое начальная точка? Было бы желательно увидеть примеры.Приложение Spring MVC и авторизация OAuth2

ответ

0

Как и при вводе SpringMVC OAuth в Google, первый вопрос SOF - это тот, и существующий ответ не очень подробный (все делается через аннотации .. никаких подробностей о том, что находится за сценой), несмотря на то, что старый дайте более подробный ответ.

Чтобы объединить SpringMVC и OAuth, вам необходимо использовать один из двух потоков, которые аутентифицируют веб-приложение с помощью Oauth: пароль пароля (или пароль владельца ресурса) или неявный поток.

Используя поток паролей, у вас будет своя страница входа (в приложении SpringMVC) и отправьте учетные данные на сервер авторизации (сервер OAuth) для их проверки. Сервер авторизации может быть создан с помощью Spring Security OAuth или может быть Google. Вы можете использовать этот пример, чтобы помочь вам сделать это: https://github.com/skate056/spring-security-oauth2-google вам нужно настроить специальный фильтр, который будет использовать RestTemplate для связи с сервером авторизации.

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

Spring:

<http auto-config="true" use-expressions="true">  
<intercept-url pattern="/login.do" access="permitAll"/> 
    <intercept-url pattern="/**" access="isAuthenticated()" /> 

<form-login 
    login-page="http://authserver/uaa/oauth/authorize?response_type=token&amp;client_id=acme&amp;scope=internal&amp;redirect_uri=http://myserver/myappli/login.do" 
    authentication-failure-url="/login.do?login_error=1" 
/> 
    <logout logout-url="/logout.do" logout-success-url="/login.do" /> 
    <custom-filter ref="oauth2ClientContextFilter" after="EXCEPTION_TRANSLATION_FILTER"/> 
    <custom-filter ref="oAuth2AuthenticationProcessingFilter" before="FILTER_SECURITY_INTERCEPTOR"/> 
</http> 

<global-method-security pre-post-annotations="enabled"/> 

<beans:bean id="oauth2ClientContextFilter" class="org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter" /> 
<beans:bean id="oAuth2AuthenticationProcessingFilter" class="fr.loicmathieu.auth.oauth.ImplicitFlowOAuthProcessingFilter"> 
    <beans:constructor-arg name="defaultFilterProcessesUrl" value="/register_token"/> 
    <beans:property name="authenticationManager" ref="theAuthenticationManager" /> 
</beans:bean> 

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

Моя реализация ImplicitFlowOAuthProcessingFilter очень проста она создает объект аутентификации из маркера, этот объект аутентификации будет использоваться вашим AuthenticationProvider, чтобы получить маркер и делать все, что вы хотите с ним:

public class ImplicitFlowOAuthProcessingFilter extends AbstractAuthenticationProcessingFilter{ 

    public ImplicitFlowOAuthProcessingFilter(String defaultFilterProcessesUrl) { 
     super(defaultFilterProcessesUrl); 
    } 

    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException{ 
     String token = request.getParameter("access_token"); 
     return this.getAuthenticationManager().authenticate(new OAuth2TokenAuthentication(token)); 
    } 

Последняя трюк - это страница входа в систему, реализация по умолчанию сервера аутентификации Spring Security OAuth добавляет токен доступа в # часть ULR, эта часть недоступна на сервере, поэтому я использую страницу входа, которая перемещает токен из параметр # part к параметру запроса access_token и перенаправление на адрес register_token:

  1. Сервер авторизации перенаправлять http://myserver/myapplication/login.do#access_token=
  2. Войти страницы с помощью JavaScript, прочитать хэш URL и перенаправлять http://myserver/myapplication/register_token?access_token=
  3. Наконец, мой ImplicitFlowOAuthProcessingFilter прочтет этот параметр, получить маркер, построить объект аутентификации который будет использоваться диспетчером аутентификации

Надеюсь, это поможет кому-то.

Loïc

+0

Есть ли вероятность, что у вас есть репо с полной конфигурацией ???Или если вы можете объяснить, где значение defaultFilterProcessesUrl должно указывать на? Если oauth2ClientContextFilter должен также регистрироваться в web.xml как делегированиеFilterProxy – Poncho1984

+0

Здравствуйте, у меня не было репо с полной конфигурацией, но я все равно пытаюсь ответить на ваш вопрос. defaultFilterProcessesUrl: должен указывать, где вы хотите, это URL-адрес для регистрации токена, поэтому URL-адрес, на который сервер авторизации перенаправляет пользователя после шага авторизации (после входа в систему). Этот URL-адрес должен иметь возможность регистрировать токен в приложении для последующего использования. oauth2ClientContextFilter: Я думаю, что нет, поскольку я использую приложения для загрузки весной, я не могу быть уверенным, но нормально, что делегированиеFilterProxy достаточно – loicmathieu

Смежные вопросы