Spring Cloud OAuth2: СНОВА перенаправлен на страницу входа после аутентификации, как если бы аутентификация не прошла при использовании формы входа

В настоящее время я изучаю Spring Cloud OAuth и довольно успешно выполнил SSO с базовым HTTP на сервере безопасности.

Теперь я пытаюсь интегрировать форму входа в систему (страница входа в Spring по умолчанию), отключив http basic. Но всякий раз, когда вводятся правильное имя пользователя и пароль, он снова перенаправляется на страницу входа на сервер безопасности, как если бы он не прошел аутентификацию.

  1. Клиент переходит в службу SSO (неавторизовано)
  2. Перенаправлен на безопасность / oauth / authorize? ... (неавторизованный)
  3. Перенаправлено на безопасность / вход, клиент вводит правильные учетные данные (аутентифицирован)
  4. Перенаправлен на безопасность / oauth / authorize? ... (неавторизованный)
  5. Перенаправлено СНОВА в безопасность / логин

Вот моя конфигурация для службы безопасности.

spring:
    profiles: development
    application:
        name: security
security:
    user:
        password: none
    oauth2:
        client:
            client-id: client
            client-secret: 1234
            grant-type: password, authorization_code, refresh_token
            scope: read, write
            auto-approve-scopes: read, write
            authorized-grant-types: password, authorization_code, refresh_token
        resource:
            user-info-uri: http://${server.address}:${server.port}${server.context-path}/oauth/user
            token-info-uri: http://${server.address}:${server.port}${server.context-path}/check_token
            prefer-token-info: false
    basic:
        enabled: false
server:
    port: 8082
    context-path: /security
    address: localhost

@SpringBootApplication
@EnableAuthorizationServer
public class Application extends SpringBootServletInitializer {

    /**
     * {@inheritDoc }
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        builder.sources(Application.class);
        return builder;
    }

    /**
     * @param arguments the command line arguments
     */
    public static void main(String[] arguments) {
        SpringApplication.run(Application.class, arguments);
    }

    @Configuration
    @EnableResourceServer
    public static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().authenticated()
                    .and()
                    .formLogin().permitAll()
                    .and()
                    .logout().permitAll();
        }

    }

    @Configuration
    @EnableWebSecurity
    public static class AuthenticationServerConfiguration extends WebSecurityConfigurerAdapter {

        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().authenticated()
                    .and()
                    .formLogin().permitAll()
                     .and()
                    .logout().permitAll();
        }

    }

}

Вот моя конфигурация для клиентской службы:

spring:
    profiles: development
    application:
        name: sso
security:
    user:
        password: none
    oauth2:
        client:
            client-id: client
            client-secret: 1234
            access-token-uri: http://${server.address}:8082/security/oauth/token
            user-authorization-uri: http://${server.address}:8082/security/oauth/authorize
        resource:
            user-info-uri: http://${server.address}:8082/security/oauth/user
            token-info-uri: http://${server.address}:8082/security/check_token
            prefer-token-info: false
server:
    port: 8085
    context-path: /sso
    address: localhost

@SpringBootApplication
@EnableOAuth2Sso
public class Application extends SpringBootServletInitializer {

    /**
     * {@inheritDoc }
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        builder.sources(Application.class);
        return builder;
    }

    /**
     * @param arguments the command line arguments
     */
    public static void main(String[] arguments) {
        SpringApplication.run(Application.class, arguments);
    }

}

Я что-то упустил или у меня неправильная конфигурация? Пожалуйста исправьте.


person Warren Nocos    schedule 05.09.2016    source источник


Ответы (2)


Я думаю, вы забываете URL-адрес успешного входа в систему. Если вы используете единый вход с Outlook, GitHub и т. Д., Этот URL-адрес должен быть указан в конфигурации клиента вашего приложения.

person Diego Rojas    schedule 05.09.2016
comment
@Diego_Arguelles У меня есть собственный сервер авторизации. - person Warren Nocos; 05.09.2016
comment
Мммм, ладно, здесь, я нашел ответ, который, я думаю, тебе поможет. - person Diego Rojas; 05.09.2016

У меня была такая же проблема, и приведенный ниже код работал у меня:

@Configuration
@EnableResourceServer
public static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .formLogin().permitAll()
                .and()
                .logout().permitAll();
    }

}

Как заявили ответственные за Spring Security, начиная с версии 2.0.4 Spring по умолчанию больше не создает сеанс, это вызывает потерю сеанса во время перенаправления на страницу утверждения. Итак, этот код: .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) заставит Spring создать сеанс для этого потока утверждения.

Я следил за этим примером проекта: OAuth2ServerConfig

person Cristiano Almeida    schedule 13.02.2018
comment
Добро пожаловать в StackOverflow. Ответы, содержащие только код, обычно помечаются для удаления, так как они низкого качества. Прочтите раздел справки об ответах на вопросы, а затем подумайте о добавлении комментариев к вашему ответу. - person Graham; 13.02.2018