#spring-security
Вопрос:
Spring security 4.2.3 У меня есть конечная точка /oauth/токен по умолчанию, мне нужно создать новую конечную точку с теми же параметрами запроса и ответа. Итак, вот мой адаптер WebSecurityConfigurerAdapter
@Configuration
@EnableResourceServer
@AllArgsConstructor
public class ResourceServerConfig extends WebSecurityConfigurerAdapter {
private final AuthenticationManager authenticationManager;
@Override
public void configure(HttpSecurity http) throws Exception {
JWTAuthenticationFilter filter = new JWTAuthenticationFilter(authenticationManager);
http.sessionManagement().sessionCreationPolicy(STATELESS)
.and()
.cors()
.and()
.csrf().disable()
.formLogin().disable()
.httpBasic().disable()
.authorizeRequests()
.antMatchers("/bbbbbb/**").authenticated()
.antMatchers("/**").permitAll()
.antMatchers("/aaaaaa/**").permitAll()
.and()
.addFilterAfter(filter, BasicAuthenticationFilter.class)
.logout().logoutSuccessUrl("/").permitAll();
}
Адаптер конфигурации сервера авторизации
@Configuration
@EnableAuthorizationServer
@AllArgsConstructor
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
private final TokenProperties tokenProperties;
private final AuthenticationManager authenticationManager;
private final TokenStore tokenStore;
private final AccessTokenConverter accessTokenConverter;
private final UserDetailsService userDetailsService;
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.allowFormAuthenticationForClients();
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore)
.accessTokenConverter(accessTokenConverter)
.authenticationManager(authenticationManager)
.userDetailsService(userDetailsService);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("rest-client")
.secret("rest-client")
.authorizedGrantTypes("password", "refresh_token")
.authorities("ROLE_CLIENT")
.scopes("read", "write")
.accessTokenValiditySeconds(tokenProperties.getTokenLifeTime())
.refreshTokenValiditySeconds(
tokenProperties.getRefreshTokenLifeTime() == 0 ?
tokenProperties.getTokenLifeTime() * 3600 :
tokenProperties.getRefreshTokenLifeTime()
);
}
Некоторые настройки
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
@Bean
@SuppressWarnings("deprecation")
AuthenticationProvider authenticationProvider(UserDetailsService userDetailsService,
PasswordEncoder passwordEncoder,
SaltSource saltSource) {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setSaltSource(saltSource);
provider.setUserDetailsService(userDetailsService);
provider.setPasswordEncoder(passwordEncoder);
return provider;
}
}
I implemented ClientCredentialsTokenEndpointFilter with new endpoint «user/verify» to keep the logic of security.
public class JWTAuthenticationFilter extends ClientCredentialsTokenEndpointFilter {
private final AuthenticationManager authenticationManager;
public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
super("/user/verify");
this.authenticationManager = authenticationManager;
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
return super.attemptAuthentication(request, response);
}
@Override
protected AuthenticationManager getAuthenticationManager() {
return this.authenticationManager;
}
}
Но я обнаружил это во время отладки потока spring. /oauth/токен вызывает службу InMemoryClientDetailsService#loadClientByClientId и после вызова реализации службы UserDetailsService#loadUserByUsername, но мой пользователь /пользователь/проверка игнорирует службу InMemoryClientDetailsService и вызывает службу UserDetailsService#loadUserByUsername.В результате я получаю некоторое исключение в своем кодере пароля. Что я должен сделать, чтобы сохранить поток?