当前位置: 首页 > 面试题库 >

Spring Security过滤器链不会忽略指定的路径

公西俊德
2023-03-14
问题内容

我有一个通过JWT进行身份验证的Spring Boot REST API。我的问题是,我已将Spring
Security配置为允许无限制地访问用于身份验证的路径/auth/token,但是当它不应该被访问时,它仍然会击中我的安全过滤器。不知道我在哪里错了,任何建议都非常适合

安全配置

public class JwtWebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationEntryPoint unauthorizedHandler;

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) 
        throws Exception {
        authenticationManagerBuilder
                .userDetailsService(this.userDetailsService)
                .passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public JwtAuthenticationFilter authenticationTokenFilter() throws Exception {
        return new JwtAuthenticationFilter();
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .authorizeRequests()
            .antMatchers("/auth/token").permitAll() // do not authenticate
            .anyRequest().authenticated()

            // TODO: configure
            .cors()
            .and()

            // TODO enable and configure
            .csrf().disable()

            // Unauthorized request handler
            .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()

            // Keep application security stateless
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        // JWT security filter
        httpSecurity.addFilterBefore(authenticationTokenFilter(), 
            UsernamePasswordAuthenticationFilter.class);

        // Disable page caching to prevent cached REST responses
        httpSecurity.headers().cacheControl();
    }

    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers(HttpMethod.POST, "/auth/token");
    }
}

过滤器

public class JwtAuthenticationFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
        FilterChain chain) throws ServletException, IOException {
        // this runs
    }
}

控制器

@RestController
public class AuthenticationController {

    // Authenticate user
    @RequestMapping(value = "/auth/token", method = RequestMethod.POST)
    public ResponseEntity<?> createAuthenticationToken(HttpServletResponse response,
        @RequestBody JwtAuthenticationRequest authenticationRequest, Device device) throws AuthenticationException {
        // never gets to run
    }
}

问题答案:

感谢@dur询问我是否正在使用Spring Boot,这使我找到了解决方案。

这使我开始考虑Spring
Boot如何自动为我们自动创建bean,最终成为这里的罪魁祸首。事实证明,我的JwtAuthenticationFilter类是由Spring
Boot自动放入过滤器链中的,但是当我在安全配置中显式声明它时,它也被包含在安全过滤器链中。因此,尽管我正确地排除/auth/tokenignoring()安全性配置中的方法,但这还不足以阻止过滤器在Spring
Boot本身的上下文中发生。解决方案是配置一个显式阻止Spring Boot添加它的bean。

@Bean
public RegistrationBean jwtAuthFilterRegister(JwtAuthenticationFilter filter) {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
    registrationBean.setEnabled(false);
    return registrationBean;
}


 类似资料:
  • 问题内容: 我在Spring 4 MVC + Security + Boot项目中设置了一个自定义身份验证过滤器。过滤器可以很好地完成工作,现在我想禁用某些URI(例如)的安全性。这是我的配置 不幸的是,当我在/ api / …下调用resource时,过滤器仍然被链接。我在过滤器中添加了println,并在每次调用时将其写入控制台。你知道我的配置有什么问题吗? 更新 过滤器代码: 问题答案: 删

  • 我在Spring 4 MVC Security Boot项目中设置了一个自定义身份验证过滤器。过滤器工作正常,现在我想禁用某些URI的安全性(如)。这是我的配置: 不幸的是,当我在下调用资源时,过滤器仍然是链接的。我在过滤器中添加了,并且每次调用都会将其写入控制台。你知道我的配置有什么问题吗? 更新 过滤代码:

  • 我有一个通过JWT进行身份验证的Spring Boot REST API。我的问题是,我已经将Spring Security配置为允许不受限制地访问用于对进行身份验证的路径,但它仍然在不应该访问的情况下访问我的安全过滤器。我不知道我哪里错了任何忠告都是恰当的

  • 主要内容:FilterChain 接口,Filter 链的拦截过程,Filter 链中 Filter 的执行顺序,示例在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。 FilterChain 接口 javax.servlet 包中提供了一个 FilterChain 接口,该接口由容器实现。容器将其实例对象

  • 我目前有log4j配置了一个XML配置文件,它有两个附录,“文件”和“电子邮件”。这两个都正常工作,但是我不想发送电子邮件给ESAPI内部产生的错误,所以我在XML文件中放入了一个新的记录器。记录器的完整列表是: 然而,这不起作用。我仍然会收到ESAPI中生成的错误的电子邮件(特别是org.owasp.esapi.reference.Log4JLogger类)。 我还尝试过使用“org.owasp

  • 我试图完成的是为我的 rest api 提供基于 jwt 令牌的身份验证。/api 下的所有内容只能使用令牌进行访问。 我在 Web 安全配置中具有以下配置方法: 这是过滤器: 我的问题是过滤器现在应用于每个url,而不仅仅是具有 /api前缀的url。 我知道我的“配置”方法可能是错误的,但它应该是什么样子?我想要完成的就是为/api路径使用过滤器。 1 个问题:为什么有两个值来配置将应用筛选器