java – Spring Boot安全性在登录失败后显示Http-Basic-Auth弹出窗口

前端之家收集整理的这篇文章主要介绍了java – Spring Boot安全性在登录失败后显示Http-Basic-Auth弹出窗口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在为学校项目,Spring Boot后端和AngularJS前端创建一个简单的应用程序,但是我似乎无法解决安全问题.

登录工作完美,但是当我输入错误的密码时,默认的登录弹出窗口显示出来,这有点烦人.我已经尝试了注释’BasicWebSecurity’并将httpBassic置于禁用状态,但没有结果(意味着登录过程根本不起作用).

我的安全类:

@H_403_6@package be.italent.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.security.SecurityProperties; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.csrf.CsrfFilter; import org.springframework.security.web.csrf.CsrfToken; import org.springframework.security.web.csrf.CsrfTokenRepository; import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.WebUtils; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } @Override public void configure(WebSecurity web){ web.ignoring() .antMatchers("/scripts/**/*.{js,html}") .antMatchers("/views/about.html") .antMatchers("/views/detail.html") .antMatchers("/views/home.html") .antMatchers("/views/login.html") .antMatchers("/bower_components/**") .antMatchers("/resources/*.json"); } @Override protected void configure(HttpSecurity http) throws Exception { http.httpBasic() .and() .authorizeRequests() .antMatchers("/user","/index.html","/","/projects/listHome","/projects/{id}","/categories","/login").permitAll().anyRequest() .authenticated() .and() .csrf().csrfTokenRepository(csrfTokenRepository()) .and() .addFilterAfter(csrfHeaderFilter(),CsrfFilter.class).formLogin(); } private Filter csrfHeaderFilter() { return new OncePerRequestFilter() { @Override protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain filterChain) throws ServletException,IOException { CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class .getName()); if (csrf != null) { Cookie cookie = WebUtils.getCookie(request,"XSRF-TOKEN"); String token = csrf.getToken(); if (cookie == null || token != null && !token.equals(cookie.getValue())) { cookie = new Cookie("XSRF-TOKEN",token); cookie.setPath("/"); response.addCookie(cookie); } } filterChain.doFilter(request,response); } }; } private CsrfTokenRepository csrfTokenRepository() { HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); repository.setHeaderName("X-XSRF-TOKEN"); return repository; } }

有没有人知道如何防止这个弹出窗口显示而不打破其余部分?

将此添加到我的Angular配置中:

@H_403_6@myAngularApp.config(['$httpProvider',function ($httpProvider) { $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; } ]);

解决方法

让我们从你的问题开始吧

如果Spring Boot应用程序的响应包含以下标题,则它不是“Spring Boot安全弹出窗口”,它是一个显示的浏览器弹出窗口:

@H_403_6@WWW-Authenticate: Basic

在您的安全配置中,会出现.formLogin().这不应该是必需的.虽然您想通过AngularJS应用程序中的表单进行身份验证,但您的前端是一个独立的JavaScript客户端,它应该使用httpBasic而不是表单登录.

您的安全配置如何

删除了.formLogin():

@H_403_6@@Override protected void configure(HttpSecurity http) throws Exception { http .httpBasic() .and() .authorizeRequests() .antMatchers("/user","/login").permitAll().anyRequest() .authenticated() .and() .csrf().csrfTokenRepository(csrfTokenRepository()) .and() .addFilterAfter(csrfHeaderFilter(),CsrfFilter.class); }

如何处理浏览器弹出窗口

如前所述,如果Spring Boot应用程序的响应包含标题WWW-Authenticate:Basic,则会显示弹出窗口.不应对Spring Boot应用程序中的所有请求禁用此功能,因为它允许您非常轻松地浏览浏览器中的api.

Spring Security有一个默认配置,允许您在每个请求中告诉Spring Boot应用程序不要在响应中添加此标头.这可以通过为您的请求设置以下标头来完成:

@H_403_6@X-Requested-With: XMLHttpRequest

如何将此标头添加到AngularJS应用程序发出的每个请求中

您可以在应用配置中添加默认标头,如下所示:

@H_403_6@yourAngularApp.config(['$httpProvider',function ($httpProvider) { $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; } ]);

后端现在将响应一个401响应,您必须通过角度应用程序处理(例如拦截器).

如果您需要一个示例如何执行此操作,您可以查看我的shopping list app.它完成了弹簧启动和角度js.

原文链接:https://www.f2er.com/java/127003.html

猜你在找的Java相关文章