如何在 Spring 服务器配置中禁用“需要身份验证的弹出窗口”?

Posted

技术标签:

【中文标题】如何在 Spring 服务器配置中禁用“需要身份验证的弹出窗口”?【英文标题】:How to disable the 'Authentification required popup' in Spring server configuration? 【发布时间】:2017-05-25 00:42:54 【问题描述】:

路由/gateways需要认证。 在浏览器中访问/gateways 时,我被重定向到/login,并出现以下表单:

如果从 angular2 应用程序访问 /gateways,则会出现以下弹出窗口:

我的spring安全配置如下:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 


    private static String REALM="Authentication";

    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception 

        auth.inMemoryAuthentication().withUser("cris").password("123").roles("ADMIN");
        auth.inMemoryAuthentication().withUser("felix").password("felix123").roles("USER");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 

        http

                .httpBasic()

                .and()
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())

                .and()
                .formLogin()

                .and()
                .authorizeRequests()
                .antMatchers("/user", "/vehicles", "/signin", "/isautheticated").permitAll().anyRequest()
                .authenticated();
    

 // Access-Control-Allow-Origin header to be present
    @Bean
    public WebMvcConfigurer corsConfigurer() 
        return new WebMvcConfigurerAdapter() 
            @Override
            public void addCorsMappings(CorsRegistry registry) 
                registry.addMapping("/**");
            
        ;
    

    /* To allow Pre-flight [OPTIONS] request from browser */
    @Override
    public void configure(WebSecurity web) throws Exception 
        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
    

那么如何禁用弹出窗口?

【问题讨论】:

【参考方案1】:

我认为您来自 angular2 的请求采用了无效的 Authorization 基本标头,它由 BasicAuthenticationFilter 处理,并抛出了 AuthenticationException,并开始进入入口点。 你可以自己实现实现AuthenticationEntryPoint的入口点,然后注入到BasicFilter,默认入口点是BasicAuthenticationEntryPoint。如您所见,它将返回一个WWW-Authenticate 响应头。

public void commence(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException authException) throws IOException, ServletException 
        response.addHeader("WWW-Authenticate", "Basic realm=\"" + realmName + "\"");
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
                authException.getMessage());
    

【讨论】:

【参考方案2】:

您应该在配置中指定formLogin() 而不是httpBasic()。你的配置方法应该是这样的。

@Override
protected void configure(HttpSecurity http) throws Exception 

    http

            .formLogin()
                .loginPage("/login");

            .and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())

            .and()
            .formLogin()

            .and()
            .authorizeRequests()
            .antMatchers("/user", "/vehicles", "/signin", "/isautheticated").permitAll().anyRequest()
            .authenticated();

【讨论】:

如果我不输入HttpBasic,则登录无效。

以上是关于如何在 Spring 服务器配置中禁用“需要身份验证的弹出窗口”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何在 spring boot + cloud 中禁用 refreshScope 健康指示器?

如何通过 XML 配置仅针对特定 URL 模式在 Spring Security 4 中禁用 CSRF?

在 Hibernate 多租户配置中禁用 Spring 数据源配置

Spring Boot - 如何在开发过程中禁用@Cacheable?

如何在 Spring-Boot 2 中禁用安全性? [复制]