首页 > 解决方案 > Spring Boot 安全性 - inMemoryAuthentication 不起作用

问题描述

这是我的安全配置代码:

@EnableWebSecurity
@EnableGlobalMethodSecurity (
        prePostEnabled=true
    )
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.inMemoryAuthentication()
                .withUser("chandra").password("{noop}1234").roles("USER").and()
                .withUser("admin").password("{noop}admin123").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/addItem","/delete").hasRole("ADMIN")
                .antMatchers("/getAllItems").hasRole("USER")
                .and().csrf().disable().headers().frameOptions().disable()
                .and()
                .formLogin();
    }
}

但是在编译 spring 时仍在为我生成密码。

Using generated security password: 49f04bde-ac1f-4e30-870b-ba0dd93d50f3

我通过打印语句检查了配置是否正在加载,发现安全配置正在加载。我应该进行任何更改以使其与给定的用户 ID 和密码一起工作。

提前致谢。

标签: spring-bootspring-security

解决方案


只是关于纯文本密码的默认提示,您可以想象接下来会发生什么。:-)

无论如何,出于测试目的,您可以在您的@Configuration班级中定义一个这样的无操作密码编码器:

为了使您的前置noop工作,请务必公开以下 bean:

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

有关详细信息,请参阅参考手册中的相应章节。作为替代方案,您可以提供良好的旧密码管理器本身:

import org.springframework.security.crypto.password.PasswordEncoder;

[…]

@Bean
public NoOpPasswordEncoder passwordEncoder() {
    return NoOpPasswordEncoder.getInstance();
}

推荐阅读