首页 > 解决方案 > Spring Security & inMemoryAuthentication() & Bad Credentials

问题描述

我在内存中设置用户的简单登录配置存在问题。每次我都找回坏凭证。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    //auth.userDetailsService(userDetailsService);

    auth.
    inMemoryAuthentication()
    .withUser("user").password("123").roles("USER")
    .and()
    .withUser("admin").password("password").roles("USER", "ADMIN");
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
    .antMatchers("/").permitAll()
    .antMatchers("/location")
    .hasAnyRole("ADMIN","USER")
    .and()
    .formLogin()
    .and()
    .csrf()
    .disable();
}

@Bean
public PasswordEncoder passwordEncoder(){
    return new BCryptPasswordEncoder();
}

}

我做错了什么??

标签: javaspring-mvcspring-security

解决方案


此答案随附完整且有效的示例单元测试

让我们稍微简化一下。如果您正在使用formLogin()您所要做的就是指定 aUserDetailsBean并且您可以将其与编码器一起使用:

@Bean
public PasswordEncoder passwordEncoder(){
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

@Bean
public UserDetailsService userDetailsService() {
    return new InMemoryUserDetailsManager(
        builder()
            .passwordEncoder(input -> passwordEncoder().encode(input))
            .username("user")
            .password("123")
            .roles("USER")
            .build(),
        builder()
            .passwordEncoder(input -> passwordEncoder().encode(input))
            .username("admin")
            .password("password")
            .roles("USER", "ADMIN")
            .build()
    );
}


@Override
protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
        //application security
        .authorizeRequests()
            .mvcMatchers("/non-secure/**").permitAll()
            .anyRequest().fullyAuthenticated()
            .and()
        .formLogin()
    ;
    // @formatter:on
}

非常欢迎您下载示例并在您的 IDE 中运行单元测试

现在这不是首选方式,因为您的代码中有明文密码。您可以将其替换为已加密密码的管理员。

@Bean
public UserDetailsService userDetailsService() {
    return new InMemoryUserDetailsManager(
        builder()
            .username("user")
            .password("{bcrypt}$2a$10$C8c78G3SRJpy268vInPUFu.3lcNHG9SaNAPdSaIOy.1TJIio0cmTK")
            .roles("USER")
            .build(),
        builder()
            .username("admin")
            .password("{bcrypt}$2a$10$XvWhl0acx2D2hvpOPd/rPuPA48nQGxOFom1NqhxNN9ST1p9lla3bG")
            .roles("USER", "ADMIN")
            .build()
    );
}

推荐阅读