Безопасность OAuth2 Single Sign Off

У меня есть два клиента (client1, client2) и OAuth (авторизация, ресурс).

Я хочу выйти из системы одного из клиентов, а другой выйдет из системы. Я пробовал этот весна-загрузка-oauth2-единого входа-выхода-выхода, но это только выход из системы, мой client1 и client2 все еще вошли в систему!

Затем я пытаюсь отозвать свои токены, пока использую следующий код:

String username = principal.getName();
Collection<OAuth2AccessToken> accessTokens = tokenStore.findTokensByClientIdAndUserName("client1", username);
accessTokens.forEach(a -> tokenServices.revokeToken(a.getValue()));

Этот код не работал, даже client1 все еще вошел в систему! Пока я вижу, что мой redis пуст и токена уже нет, но мой client1 все еще вошел в систему! Как такое возможно?

================================================== ========================= Вот моя конфигурация:

Клиент - application.yml:

server:
  port: 8081
  servlet:
    context-path: /clt1

spring:
  application:
    name: client1

  thymeleaf: 
    cache: false

security:
  oauth2:
    client:
      client-id: client1 
      client-secret: secret1
      userAuthorizationUri: http://localhost:8000/oa/oauth/authorize
      access-token-uri: http://localhost:8000/oa/oauth/token
      scope: read, write
      #pre-established-redirect-uri: http://localhost:8081/clt1/callback 
      #registered-redirect-uri: http://localhost:8081/clt1/callback
      #use-current-uri: false 
    resource:
      user-info-uri: http://localhost:8000/oa/user 
      #jwt:
      #  key-uri: http://localhost:8000/oa/oauth/token_key 

logging:
  level:
    root: info

Клиент - SecurityConfig:

@Configuration
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .csrf().disable()
            .antMatcher("/**")
            .authorizeRequests()
            .antMatchers().permitAll()
            .anyRequest().authenticated()
            .and()
            .logout().logoutSuccessUrl("http://localhost:8000/oa/revokeClient").permitAll();
    }

}

Oauth - application.yml:

server:
  port: 8000
  servlet:
    context-path: /oa

spring:
  application:
    name: security

  redis:
    host: 127.0.0.1
    port: 6379

  thymeleaf: 
    cache: false

logging:
  level:
    root: info

Oauth - Конфигурация авторизации:

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients
            .inMemory()
            .withClient("client1")
            .secret(passwordEncoder.encode("secret1"))
            .scopes("read", "write")
            .redirectUris("http://localhost:8081/clt1/login")
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .autoApprove(true)
            .and()
            .withClient("client2")
            .secret(passwordEncoder.encode("secret2"))
            .scopes("read", "write")
            .redirectUris("http://localhost:8082/clt2/login")
            .authorizedGrantTypes("authorization_code", "refresh_token")
            .autoApprove(true);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore);
    }

}

Oauth - ResourceConfig:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/**")
            .authorizeRequests().anyRequest().authenticated();
    }

}

Oauth - SecurityConfig:

@Configuration
@EnableWebSecurity
@Order(1)//SecurityConfig >> ResourceConfig
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .requestMatchers()
            .antMatchers("/loginPage", "/login**", "/registerPage", "/register", "/oauth/authorize", "/revokeClient")
            .and()
            .authorizeRequests()
            .antMatchers("/registerPage", "/register").permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .formLogin().loginPage("/loginPage").loginProcessingUrl("/login").permitAll();

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/css/**", "/docs/**", "/fonts/**", "/img/**", "/js/**", "/plugins/**");
    }

}

Oauth - Приложение:

@SpringBootApplication
@Configuration
public class SsoDemoOauthApplication {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Bean
    public TokenStore tokenStore() {
        return new RedisTokenStore(connectionFactory);
    }

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

}

какой токен вы используете?

JEY 26.11.2018 10:22

Я использую redis tokenstore. И я пробовал jwt, но он тоже не работает. @ JEY

exces 27.11.2018 02:38

Не могли бы вы предоставить конфигурацию пружины?

JEY 27.11.2018 09:33

Привет @JEY. Я прошил всю свою конфигурацию.

exces 28.11.2018 09:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
485
1

Ответы 1

Признаюсь, не слишком умен, но как насчет того, чтобы поставить

.logout().logoutSuccessUrl("http://localhost:8000/oa/logout").permitAll();

вместо

.logout().logoutSuccessUrl("http://localhost:8000/oa/revokeClient").permitAll();

в SecurityConfig клиентского приложения? Есть ли недостаток?

Я пробовал это. На самом деле мой клиент выходит из системы, но клиент все еще вошел в систему. :(

exces 06.12.2018 02:57

Другие вопросы по теме