Как выполнить однократный выход из единого входа Spring mvc с помощью Spring OAuth2? - PullRequest
0 голосов
/ 07 июля 2019

Я разрабатываю весеннее веб-приложение с SSO architect с помощью Spring OAuth2

  • 2 весенних веб-приложения mvc
  • 1 сервер авторизации отвечает за единый вход и выдачу / проверку токенов
  • 1 сервер ресурсов, обслуживающий / api / me

Все работает хорошо при однократном входе, но я не знаю, как единый выход (1 приложение выходит из системы, другие приложения также выходят из системы). В настоящее время кажется, что каждое приложение с минимальной конфигурацией, такой как фрагмент кода ниже, использует другое хранилище сеансов, и после успешной аутентификации он сохраняет аутентифицированный сеанс в своем собственном хранилище сеансов, и каждый последующий запрос перехватывается с сеансом в файле cookie. Таким образом, при выходе из sso-сервера он не может сделать недействительными связанные сеансы в хранилищах сеансов других приложений. Кто-нибудь может мне предложить несколько стратегий для единого выхода?

Файл application.yml веб-клиента:

security:
  oauth2:
    client:
      clientId: metlife_monitor
      clientSecret: password
      accessTokenUri: http://localhost:8668/sso-server/oauth/token
      userAuthorizationUri: http://localhost:8668/sso-server/oauth/authorize
      tokenName: oauth_token
    resource:
      userInfoUri: http://localhost:8688/api/me

Класс веб-приложения:

@SpringBootApplication
@EnableOAuth2Sso
@EnableJdbcHttpSession
public class Application  extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .antMatcher("/**")
                .authorizeRequests()
                .antMatchers("/", "/login**", "/error**", "/webjars/**").permitAll()
                .anyRequest().authenticated()
                .and().logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("http://localhost:8668/sso-server/logout")
                .invalidateHttpSession(true)
                .deleteCookies("client-session", "JSESSIONID")
                .permitAll()
                .and().csrf().disable()
        ;

    }
    public static void main(String[] args) {
        SpringApplication.run(App1Application.class, args);
    }

}

1 Ответ

0 голосов
/ 07 июля 2019

Существует разница между сервером единого входа (SSO) и сервером центральной аутентификации (CAS).Если ваш сервер аутентификации не управляет какими-либо сеансами, он перестает быть сервером SSO и просто становится CAS.

В вашем случае вы можете настроить сервер SSO для управления сеансами, а также распределить идентификатор сеанса по этому ресурсу.Серверы проверит это перед обслуживанием запроса.Это приводит к болтливой системе.Если вы можете жить с небольшой задержкой после истечения сеанса, то вы можете создавать очень недолговечные токены, которые подключены к SSO и вам не нужно будет проверять токен с каждым запросом, вы только обновите токен, если он еще есть.допустимый сеанс.

Если можете, рассмотрите возможность использования Keycloak .Он также имеет адаптеры для приложений Java и Javascript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...