Как выйти из системы весной в режиме без сохранения состояния (токен jwt)? - PullRequest
0 голосов
/ 28 августа 2018

Я создаю микросервисную систему к весне. В моем проекте у меня есть 3 внешних интерфейса и несколько микросервисов. Эти внешние интерфейсы используют (и сохраняют в cookie) токен jwt для получения ресурсов от моих микросервисных услуг.

Мой сценарий входа в систему: Когда пользователь хочет войти в систему из внешнего интерфейса, я перенаправляю его в свой рабочий проект (другой интерфейсный пользователь), входящий в мой рабочий интерфейс, и перенаправляю в первый интерфейс и передаю токен в параметре запроса, чтобы внешний интерфейс мог использовать этот токен для получить ресурс. При входе пользователя из внешнего интерфейса два перенаправляются в оперативный режим, когда пользователь вошел в систему ранее в файле cookie текущего токена, сохраненного без получения имени пользователя и пароля, перенаправляется во второй интерфейс с существующим токеном. Это мой ссо:).

Но я не могу выйти из системы, потому что когда пользователь выходит из системы (удаляет токен из cookie), как понимать другие интерфейсы пользователя, вышедшего из системы.

Я думаю, что мне нужно создать сеанс для получения статуса входа пользователя. Или мне нужна централизованная проверка статуса токена.

Как можно создать этот сеанс ??

Мой код безопасности пружины является безопасностью по умолчанию для пружины.

Наконец, я прошу прощения за мой английский. ;)

Код моего живого проекта (UAA)

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends 
AuthorizationServerConfigurerAdapter {
@Value("${jwt.token.access-token-validity-seconds}")
private Integer accessTokenValiditySeconds;
@Value("${jwt.token.support-refresh-token}")
private Boolean supportRefreshToken;

private final AuthenticationManager authenticationManager;
private final ClientDetailsServiceImpl clientDetailsService;
private final AccountService userDetailsService;

public OAuth2AuthorizationServerConfig(AuthenticationManager authenticationManager,
        ClientDetailsServiceImpl clientDetailsService, AccountService userDetailsService) {
    super();
    this.authenticationManager = authenticationManager;
    this.clientDetailsService = clientDetailsService;
    this.userDetailsService = userDetailsService;
}

@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.withClientDetails(clientDetailsService);
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
    tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter()));

    endpoints.tokenStore(tokenStore()).tokenEnhancer(tokenEnhancerChain)
            .authenticationManager(authenticationManager).userDetailsService(userDetailsService);
}

@Bean
public TokenStore tokenStore() {
    return new JwtTokenStore(accessTokenConverter());
}

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
      JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        KeyStoreKeyFactory keyStoreKeyFactory = 
          new KeyStoreKeyFactory(new ClassPathResource("key.jks"), "sayar1234".toCharArray());
        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("key"));

        Resource resource = new ClassPathResource("public-key.txt");
        String publicKey = null;
        try {
            publicKey = IOUtils.toString(resource.getInputStream());
        } catch (final IOException e) {
            throw new RuntimeException(e);
        }

        converter.setVerifierKey(publicKey);

        return converter;
}

@Bean
@Primary
public DefaultTokenServices tokenServices() {
    DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
    defaultTokenServices.setTokenStore(tokenStore());
    defaultTokenServices.setSupportRefreshToken(supportRefreshToken);
    defaultTokenServices.setAccessTokenValiditySeconds(accessTokenValiditySeconds);
    return defaultTokenServices;
}

@Bean
public TokenEnhancer tokenEnhancer() {
    return new CustomTokenEnhancer();
}
}

другие ресурсы

@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfig extends 
ResourceServerConfigurerAdapter {

@Override
public void configure(final HttpSecurity http) throws Exception {
    // @formatter:off
    http.csrf().disable() // csrf
            .antMatcher("/**").authorizeRequests() // /**
            .antMatchers("/actuator/**").permitAll() // Actuator
            .antMatchers("/ws/**").permitAll() // websocket
            .anyRequest().authenticated();
    // @formatter:on
}

@Override
public void configure(ResourceServerSecurityConfigurer config) {
    config.tokenServices(tokenServices());
}

@Bean
public TokenStore tokenStore() {
    return new JwtTokenStore(accessTokenConverter());
}

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    Resource resource = new ClassPathResource("public-key.txt");
    String publicKey = null;
    try {
        publicKey = IOUtils.toString(resource.getInputStream());
    } catch (final IOException e) {
        throw new RuntimeException(e);
    }
    converter.setVerifierKey(publicKey);
    return converter;
}

@Bean
@Primary
public DefaultTokenServices tokenServices() {
    DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
    defaultTokenServices.setTokenStore(tokenStore());
    return defaultTokenServices;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...