У меня есть приложение - сервер 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 то все работает так как и должно, при следующем запросе клиент просит заново ввести логин и пароль на странице логина приложения - сервера. Но если я возвращаю страницу или делаю редирект клиент самостоятельно логинится на сервер под предыдущим юзером и получает новый токен. Что надо сделать чтобы этого не происходило?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Не могу разобраться с итераторами, здесь он выводит просто подряд числа, как сделать так, чтобы выводились числа, которые стоят на нечетной...