Привет, у меня есть Rest WS, использующий WebSecurityConfigurerAdapter для реализации HTTP Basic auth. Пароль разрешено обновлять, и мне нужно разрешить WS забирать обновленный пароль без перезапуска сервера. Ниже приведены коды:
SecurityConfig
// init a user with credentials admin/password
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//disable csrf
.csrf().disable()
//authentic all requests
.authorizeRequests().anyRequest().authenticated().and().httpBasic()
//disable session
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(inMemoryUserDetailsManager());
}
@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
Properties users = new Properties();
users.put("admin", "password,USER,enabled");
return new InMemoryUserDetailsManager(users);
}
}
Контроллер, который будет обновлять пароль
@RestController
public class someController{
@Autowired
public InMemoryUserDetailsManager inMemoryUserDetailsManager;
// update password from password -> pass
@RequestMapping(...)
public updatePass(){
ArrayList<GrantedAuthority> grantedAuthoritiesList = new ArrayList<>();
grantedAuthoritiesList.add(new SimpleGrantedAuthority("USER"));
this.inMemoryUserDetailsManager.updateUser(new User("admin", "pass", grantedAuthoritiesList));
}
// another way that also doesn’t work
@RequestMapping(...)
public newUpdate(){
ArrayList<GrantedAuthority> grantedAuthoritiesList = new ArrayList<>();
grantedAuthoritiesList.add(new SimpleGrantedAuthority("USER"));
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken("admin", "pass",
grantedAuthoritiesList);
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(auth);
SecurityContextHolder.setContext(context);
}
}
После первого вызова updatePass () с учетными данными admin / password я вижу, что в отладчике пароль обновлен до «pass»
Я предполагаю, что для повторного вызова updatePass () мне следует использовать admin / pass . Однако оказалось, что он все еще использует старый admin / password .
Источники, на которые я ссылался при написании этого кода source1 source2
* Я использую Advance Rest Client для совершения звонков