Конфигурация Spring OAuth2 XML по-прежнему выдает ошибки о перенаправлениях и анонимном доступе - PullRequest
0 голосов
/ 11 июля 2019

Я пытался заставить Spring OAuth2 работать с конфигурацией XML. У меня есть полностью (не Spring Boot) работающее приложение, использующее Spring Security с последними версиями библиотек. До этого я настроил и работал Spring Social для Google.

Конфигурация XML.

Начиная с контекста приложения (есть намного больше, но, вероятно, не имеет значения). Я написал свой ClientTokenServicesImpl, но он работает так же.

<oauth:client id="oAuth2ClientFilter" />
<oauth:resource id="google" type="authorization_code" client-id="${google.clientId}" client-secret="${google.clientSecret}" access-token-uri="${google.accessTokenUri}"
    user-authorization-uri="${google.authorisationUri}" scope="email,profile,openid" />
<oauth:rest-template id="oAuthRestTemplate" resource="google" access-token-provider="accessTokenProvider" />

<bean id="accessTokenProvider" class="org.springframework.security.oauth2.client.token.AccessTokenProviderChain">
    <property name="clientTokenServices">
        <bean class="com.tetsuwantech.atom.manager.authentication.oauth2.ClientTokenServicesImpl" />
    </property>
    <constructor-arg>
        <list>
            <bean class="org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider" />
            <bean class="org.springframework.security.oauth2.client.token.grant.implicit.ImplicitAccessTokenProvider" />
            <bean class="org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider" />
            <bean class="org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsAccessTokenProvider" />
        </list>
    </constructor-arg>
</bean>

<security:http entry-point-ref="authenticationEntryPoint" access-decision-manager-ref="accessDecisionManager">
...
    <security:intercept-url pattern="/oauth2/**" access="permitAll" />
...
    <security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="oAuth2ClientFilter" />
</security:http>

Контроллер

У меня есть простой Controller, который просто звонит в Google, чтобы получить профиль пользователя. Как только я получу данные правильно, я смогу использовать их для создания новой учетной записи пользователя или для аутентификации пользователя. (Я думал, что Spring сделает аутентификацию для меня.)

@Inject
private RestOperations restTemplate;

@RequestMapping(value = "/oauth2/google")
public String google() {

    ObjectNode objectNode = restTemplate.getForObject("https://people.googleapis.com/v1/people/me", ObjectNode.class);
    return "redirect:/";
}

UserRedirectRequiredException

Если пользователь вошел в систему, а затем нажал на URL, который я получил

org.springframework.security.oauth2.client.resource.UserRedirectRequiredException: A redirect is required to get the users approval

В большинстве примеров говорится о повышении на oAuth2ClientFilter выше сразу после SECURITY_CONTEXT_FILTER, но у меня это не сработало.

InsufficientAuthenticationException

Если пользователь не аутентифицирован, тогда я получаю

org.springframework.security.authentication.InsufficientAuthenticationException: Authentication is required to obtain an access token (anonymous not allowed)

Учитывая, что я хочу пройти аутентификацию пользователя через Google, это кажется ироничным.

Я посмотрел примеры в https://projects.spring.io/spring-security-oauth/docs/oauth2.html и много-много Stackoverflow и других примеров, и я не вижу, что должно произойти или где я ошибся.

...