如何在 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 数据源配置