Spring Boot / Spring Security正在忽略来自JavaScript的/ login调用

声神经素

我使用的是Spring-Boot 1.1.7,带有春季安全性,html(没有百里香叶)和javascript。使用javascript提交登录名时,我无法使登录名正常工作。当我将html与表单一起使用时,spring-security会接受请求,进行身份验证并愉快地进行。但是使用Javascript,我得到了302重定向并且没有身份验证。

这是我的配置:

@ComponentScan
@EnableAutoConfiguration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MyApplication {
    public static void main(String[] args) {
        ApplicationContext edm = SpringApplication.run( MyApplication.class, args );
    }
}

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/menu").permitAll()
                .antMatchers("/error").permitAll()
                .antMatchers("/resources/**").permitAll()
                .antMatchers("/css/**").permitAll()
                .antMatchers("/js/**").permitAll()
                .antMatchers("/fonts/**").permitAll()
                .antMatchers("/libs/**").permitAll();


        http
                .formLogin().failureUrl("/login?error")
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
                .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/")
                .permitAll();

        http
                .sessionManagement()
                .maximumSessions(1)
                .expiredUrl("/login?expired")
                .maxSessionsPreventsLogin(true)
                .and()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                .invalidSessionUrl("/");

        http
                .authorizeRequests().anyRequest().authenticated();
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        auth.userDetailsService( customUserDetailsService ).passwordEncoder( encoder );
    }

    @Override
    public void configure(WebSecurity security){
        security.ignoring().antMatchers("/css/**","/fonts/**","/libs/**");
    }
}

我有自己的UserDetailsS​​ervice

@Component
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {

        User user = userService.findByUsername( userName );
        if ( user == null ) {
            throw new UsernameNotFoundException( "UserName " + userName + " not found" );
        }
        return user;
    }
}

最后,这是提交帖子的javascript:

var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$("#login").click(function(){
  username=$("#username").val();
  password=$("#password").val();
  $.ajax({
   type: "POST",
   url: "/login",  
   beforeSend: function(xhr){
       xhr.setRequestHeader(header, token);
   },
   data: "username="+username+"&password="+password,
   success: function(html){
        alert("logged in");
    }
  });
return false;
});

如果我从url / login进行此调用,则会得到spring提供的登录表单,并且一切正常。但是我需要使用javascript,所以我想知道是否需要做些其他的事情来告诉spring寻找它?

声神经素

这是为我工作的答案/解决方案。根据本文(http://patrickgrimard.com/2014/01/03/spring-security-csrf-protection-in-a-backbone-single-page-app/),添加了aCSRFTokenGeneratorFilter extends OncePerRequestFilter并将其连接到我的安全性上配置,允许使用我的javascript提供的参数。

public final class CSRFTokenGeneratorFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        CsrfToken token = (CsrfToken) request.getAttribute("_csrf");

        response.setHeader("X-CSRF-HEADER", token.getHeaderName());
        response.setHeader("X-CSRF-PARAM", token.getParameterName());
        response.setHeader("X-CSRF-TOKEN", token.getToken());
        filterChain.doFilter(request, response);
    }
}

接线为:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customUserDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterAfter(new CSRFTokenGeneratorFilter(), CsrfFilter.class)
                .authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/login").permitAll()
..}
}

我不确定为什么需要过滤器,但是我想spring-boot / security不会使用它作为默认值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring Boot Thymeleaf Ajax 调用

来自分类Dev

Spring Boot或Spring Security内存可能泄漏

来自分类Dev

Spring Boot ServeletInitializer和Spring Security

来自分类Dev

Spring Boot中Spring Security的XML配置

来自分类Dev

使用Spring Boot配置Spring Security

来自分类Dev

Spring Boot或Spring Security内存可能泄漏

来自分类Dev

带有Spring Boot的Spring Security

来自分类Dev

Spring Boot忽略ObjectMapper模块

来自分类Dev

Spring Boot忽略主类

来自分类Dev

在 Spring-boot 中忽略来自特定请求的字段

来自分类常见问题

Spring MVC与Spring Boot与Spring

来自分类常见问题

Spring MVC或Spring Boot

来自分类Dev

Spring Boot Security 不忽略使用 WebSecurity 的目录

来自分类Dev

spring boot 调用 thymeleaf 模板失败

来自分类Dev

Spring Boot,Spring MVC JSON RequestBody:未知属性被忽略

来自分类Dev

如何在Spring Boot项目中忽略特定URL的Spring Security CSRF

来自分类Dev

Spring Boot忽略@JsonDeserialize和@JsonSerialize

来自分类Dev

忽略Spring Boot中某些端点的授权

来自分类Dev

Weblogic中忽略了Spring-boot @ImportResource

来自分类Dev

Spring boot rest 忽略一类

来自分类Dev

忽略在 spring boot 中本地执行的测试

来自分类Dev

使用AspectJ的Spring Boot + Spring Security无法正常工作

来自分类Dev

Spring Security / Spring Boot-如何为用户设置ROLES

来自分类Dev

spring-boot,spring-security和dropwizard指标

来自分类Dev

如何在Spring Boot中覆盖Spring Security默认配置

来自分类Dev

从Spring Boot Oauth2迁移到Spring Security 5

来自分类Dev

没有Spring Security的Spring-Boot登录

来自分类Dev

Spring Boot-如何终止当前的Spring Security会话?

来自分类Dev

如何使用 Spring Security 在 Spring Boot 中管理会话?

Related 相关文章

热门标签

归档