不同的端点看似随机地被授权

时间:2019-01-17 23:32:01

标签: java spring spring-security

我正在编写一个应用程序,试图在其中配置不同端点的可见性。

我写了以下代码:

@Override
   protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().authorizeRequests()
        .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
        .antMatchers(HttpMethod.POST, "/login").permitAll()
        .antMatchers(HttpMethod.GET, "/login").permitAll()
        .antMatchers(HttpMethod.GET, "/").authenticated()
        .antMatchers(HttpMethod.GET, UPVOTE_URL).authenticated()
        .antMatchers(HttpMethod.GET, DOWNVOTE_URL).authenticated()
        .antMatchers(HttpMethod.POST, LOG_OUT_URL).authenticated()
        .antMatchers(HttpMethod.DELETE, DELETE_URL).authenticated()
        .antMatchers(HttpMethod.POST, ADD_URL).authenticated()
        .anyRequest().authenticated()
        .and()
        .addFilter(new JWTAuthenticationFilter(authenticationManager()))
        .addFilter(new JWTAuthorizationFilter(authenticationManager()))      
     .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .logout()
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(new Http401AuthenticationEntryPoint("No authorization"));

我的程序的行为非常奇怪,因为当我尝试到达“ / login”或“ /”端点时,该程序有时会返回401(如果用户未签名,则afaik应该重定向到登录页面)在)。

此后,我重新启动它,也许在其他地方进行了一些细微更改,这些更改似乎完全无关紧要,然后我的网站又可以正常工作了。

你们中有人遇到过这类问题吗?是什么原因呢?我在配置中做错了什么吗?

1 个答案:

答案 0 :(得分:1)

这里突出的三件事

  1. 您有一个自定义的入口点,并且认为入口点发送的是401,而不是重定向到/ login

  2. 您没有formLogin(),因此处理登录页面的过滤器不在起作用

  3. 我们不知道您的过滤器在做什么以及何时执行

关于配置,让我们先开始

    http
        .cors()
            .and()
        .csrf()
            .disable()
        .authorizeRequests()
            .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
            .antMatchers("/login").permitAll()
            .antMatchers(HttpMethod.GET, "/").authenticated()
            .antMatchers(HttpMethod.GET, UPVOTE_URL).authenticated()
            .antMatchers(HttpMethod.GET, DOWNVOTE_URL).authenticated()
            .antMatchers(HttpMethod.POST, LOG_OUT_URL).authenticated()
            .antMatchers(HttpMethod.DELETE, DELETE_URL).authenticated()
            .antMatchers(HttpMethod.POST, ADD_URL).authenticated()
            .anyRequest().authenticated()
            .and()
        .addFilterBefore(new JWTAuthenticationFilter(authenticationManager()), HeaderWriterFilter.class)
        .addFilterAfter(new JWTAuthorizationFilter(authenticationManager()), JWTAuthenticationFilter.class)
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .formLogin()
            .and()
        .logout()
        ;

那我们做了什么改变

  1. 删除身份验证入口点,并将JWT筛选器移到最前面。 如果这些过滤器触发了(并且它们不应该针对非REST端点触发,那么您必须编写该逻辑),那么系统要么已通过身份验证,要么过滤器本身返回401并且不会引发异常。也许您可以让我们知道这些过滤器是否确实在做正确的事?

  2. 如果JWT过滤器不执行任何操作,则其他所有功能都将发挥作用。因此,我们在formLogin()中添加了所有默认配置。如果由于请求入口未通过身份验证而调用身份验证入口点,则会重定向到/ login