Spring Security OAuth2 RestTempate logout

407
19 июля 2017, 22:35

У меня есть приложение - сервер OAuth2 и приложение клиент. Как правильно сделать logout для клиента?

Security config клиента:

@Configuration
@EnableOAuth2Sso
public class Security extends WebSecurityConfigurerAdapter {
@Autowired
private OAuth2ProtectedResourceDetails oAuth2ProtectedResourceDetails;
@Autowired
private OAuth2ClientContext oAuth2ClientContext;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
            .antMatchers("/", "/login")
                .permitAll()
            .anyRequest()
                .authenticated()
        .and()
            .logout()
                .logoutUrl("/logout").clearAuthentication(true).permitAll()
        .and()
            .csrf()
                .disable();//.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
@Bean
OAuth2RestTemplate oAuth2RestTemplate() {
OAuth2RestTemplate template = new OAuth2RestTemplate(oAuth2ProtectedResourceDetails, oAuth2ClientContext);
return template;
    }
}

Logout контроллер сервера:

@RestController
public class OauthController {
@Autowired
private ConsumerTokenServices consumerTokenServices;
@Autowired
private TokenStore tokenStore;
@RequestMapping("/oauth/logout")
@ResponseBody
public ResponseEntity revoketoken(HttpSession session,
                              OAuth2Authentication authentication) {
OAuth2AccessToken token = ((DefaultTokenServices) consumerTokenServices).getAccessToken(authentication);
consumerTokenServices.revokeToken(token.getValue());
tokenStore.removeAccessToken(token);
tokenStore.removeRefreshToken(token.getRefreshToken());
session.invalidate();
return new ResponseEntity(HttpStatus.ACCEPTED);
    }
}

Logout контроллер клиента:

@RequestMapping("/admin/logout")
    public String logout(HttpSession httpSession, Authentication authentication) throws InterruptedException {
    System.out.println(restTemplate.getAccessToken().getValue());
   ResponseEntity responseEntity = restTemplate.getForEntity("http://localhost:8080/dwp/oauth/logout",Object.class);
   SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false);
   httpSession.invalidate();
   return "logout";
}

Если из последнего метода я возвращаю ResponseEntity то все работает так как и должно, при следующем запросе клиент просит заново ввести логин и пароль на странице логина приложения - сервера. Но если я возвращаю страницу или делаю редирект клиент самостоятельно логинится на сервер под предыдущим юзером и получает новый токен. Что надо сделать чтобы этого не происходило?

READ ALSO
CASCADE.ALL не работает

CASCADE.ALL не работает

У меня есть 2 EntityProduct и User:

312
Вывести числа на нечетных позициях

Вывести числа на нечетных позициях

Не могу разобраться с итераторами, здесь он выводит просто подряд числа, как сделать так, чтобы выводились числа, которые стоят на нечетной...

310
Работа с файлом на удаленке

Работа с файлом на удаленке

Selenium + TestNG + Winium(Java)

251