在Spring Security中实现基本身份验证后总是出现401错误

在Spring Security中实现基本身份验证后总是出现401错误,spring,spring-boot,spring-security,Spring,Spring Boot,Spring Security,我正在尝试使用Spring安全注释实现HTTP基本身份验证 我有一个REST端点,定义如下: @RequestMapping("/foo/") 我只想让管理员角色的人访问/foo/endpoint 接下来,我将配置Spring安全性,如下所示: @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter {       private stat

我正在尝试使用Spring安全注释实现HTTP基本身份验证

我有一个REST端点,定义如下:

@RequestMapping("/foo/")
我只想让管理员角色的人访问/foo/endpoint

接下来,我将配置Spring安全性,如下所示:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 
    private static String REALM="MY_TEST_REALM";
     
    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("ADMIN");
        auth.inMemoryAuthentication().withUser("tom").password("abc123").roles("USER");
    }
     
    @Override
    protected void configure(HttpSecurity http) throws Exception {
  
      //http.csrf().disable()
      http  
      .authorizeRequests()
        .antMatchers("/foo/").hasRole("ADMIN")
        .and().httpBasic().realmName(REALM).authenticationEntryPoint(getBasicAuthEntryPoint())
        .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);//We don't need sessions to be created.
    }
     
    @Bean
    public CustomBasicAuthenticationEntryPoint getBasicAuthEntryPoint(){
        return new CustomBasicAuthenticationEntryPoint();
    }
     
    /* To allow Pre-flight [OPTIONS] request from browser */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
    }
}
所以,我只希望密码为abc123的bill username能够调用REST端点

接下来,我定义应该返回的错误

public class CustomBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
 
    @Override
    public void commence(final HttpServletRequest request, 
            final HttpServletResponse response, 
            final AuthenticationException authException) throws IOException, ServletException {
        //Authentication failed, send error response.
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        response.addHeader("WWW-Authenticate", "Basic realm=" + getRealmName() + "");
         
        PrintWriter writer = response.getWriter();
        writer.println("HTTP Status 401 : " + authException.getMessage());
    }
     
    @Override
    public void afterPropertiesSet() throws Exception {
        setRealmName("MY_TEST_REALM");
        super.afterPropertiesSet();
    }
}
我试着用Postman进行测试,我使用的是具有正确凭据的Basic Auth,但我总是遇到401错误。我是否遗漏了任何一步

请看下面邮递员的截图。我是否缺少任何标题?

这是标题部分 (我在上面的截图中隐藏了基本URL)

编辑

别忘了让
安全配置
正常工作


类似于
@Import({SecurityConfiguration.class})
组件扫描(“”)

注释。我的问题是我把@Import({SecurityConfiguration.class})注释放在哪里(哪个Java类)?是CustomBasicAuthenticationEntryPoint.java还是SecurityConfiguration.java或Application.java?好的。我在@Configuration@Import({SecurityConfiguration.class})公共类AppConfig{}中尝试了以下操作,但没有成功。感谢您的帮助。你是对的。我在Application.java中添加了以下行,现在可以使用了:ApplicationContext context=newannotationConfigApplicationContext(AppConfig.class);可能是我的问题,但你能给出更详细的解决方案吗?你必须把那些注解放在哪里?