Обновленный пароль не получен после вызова InMemoryUserDetailsManager updateUser - PullRequest
0 голосов
/ 29 октября 2019

Привет, у меня есть 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»

enter image description here

Я предполагаю, что для повторного вызова updatePass () мне следует использовать admin / pass . Однако оказалось, что он все еще использует старый admin / password .

Источники, на которые я ссылался при написании этого кода source1 source2

* Я использую Advance Rest Client для совершения звонков

1 Ответ

0 голосов
/ 29 октября 2019

Когда вы обновляете пароль, вы должны установить UserDetails в объекте springSecurityContext, если пользователь аутентифицирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...