В нашей команде мы внедрили привязку аккаунта с использованием кода авторизации Spring auth2, который впервые отображает страницу входа и приводит к успеху, приводящему к access_token и refresh_token.Однако, когда мы удаляем связь с учетной записью и пытаемся установить связь снова, она не отображает страницу входа и напрямую показывает успешность входа в систему с учетной записью, связанной с предыдущими учетными данными пользователя.При удалении ссылок мы подтвердили, что клиент (amazon) очищает токен доступа.
Любая помощь или подсказка будут полезны.
подробности maven pom с использованными зависимостями и версиями ключей.
- spring-boot-starter-parent = 1.4.3.RELEASE
- spring-security-oauth2 =2.2.0.RELEASE
- spring-boot-starter-security
- spring-boot-starter-web
Настройка конфигурации производится следующим образом.
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
DataSource dataSourceOauth;
@Value("${oauth_signing_key}")
private String signingKey; // Key used to digitally sign the JWT token
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private CurrentClient currentClient;
/**
* Configure the non-security features of the Authorization Server endpoints, like token store,
* token customizations, user approvals and grant types.
*/
@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);
endpoints.pathMapping("/oauth/authorize", "/vialexa/oauth/authorize");
endpoints.pathMapping("/oauth/token", "/vialexa/oauth/token");
}
@Bean
public TokenEnhancer tokenEnhancer() {
return new CustomTokenEnhancer();
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey(signingKey);
return converter;
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
public JdbcClientDetailsService clientDetailsService() {
JdbcClientDetailsService detailsService = new JdbcClientDetailsService(dataSourceOauth) {
@Override
public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
ClientDetails clientDetails = null;
clientDetails = super.loadClientByClientId(clientId);
currentClient.setClientId(clientId);
return clientDetails;
} // end of loadClientByClientId
}; // end of inner class
detailsService.setSelectClientDetailsSql("<query to fetch the client details>");
return detailsService;
}
@Bean
public JdbcClientTokenServices clientTokenService() {
return new JdbcClientTokenServices(dataSourceOauth);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(clientDetailsService());
}
@Bean(name = "jdbcTokenStore")
public TokenStore jdbcTokenStore() {
return new JdbcTokenStore(dataSourceOauth);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.checkTokenAccess("permitAll()");
}
}
@Configuration
@EnableWebSecurity ( debug = true )
@Order(1)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private ClientDetailsService clientService;
@Autowired
private DataSource dataSourceOauth;
@Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSourceOauth).passwordEncoder(passwordEncoder())
.usersByUsernameQuery("<user query>")
.authoritiesByUsernameQuery(<User query>");
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
@Bean
@Autowired
public TokenStoreUserApprovalHandler userApprovalHandler(TokenStore tokenStore) {
TokenStoreUserApprovalHandler handler = new TokenStoreUserApprovalHandler();
handler.setTokenStore(tokenStore);
handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientService));
handler.setClientDetailsService(clientService);
return handler;
}
@Bean
@Autowired
public ApprovalStore approvalStore(TokenStore tokenStore) throws Exception {
TokenApprovalStore store = new TokenApprovalStore();
store.setTokenStore(tokenStore);
return store;
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.sessionManagement().disable();
http.csrf().disable();
http.headers().cacheControl().disable();
http.authorizeRequests().antMatchers("/login.jsp").authenticated();
http.authorizeRequests().and().formLogin().loginPage("/login.jsp")
.loginProcessingUrl("/j_spring_security_check").usernameParameter("j_username")
.failureUrl("/InvalidUserNamePassword.jsp").passwordParameter("j_password");
http.authorizeRequests().and().logout().logoutUrl("/j_spring_security_logout");
}
}