Spring security antMatcher 不起作用

Posted

技术标签:

【中文标题】Spring security antMatcher 不起作用【英文标题】:Spring security antMatcher does not work 【发布时间】:2018-06-26 00:37:47 【问题描述】:

编辑:

我进一步深入研究了问题,结果发现即使使用单一配置,问题仍然存在。如果我使用单一配置并保持

http.antMatcher("/api/test/**")

网址没有得到保护。 删除 antMatcher 和 antMatchers 会立即保护 url。 即如果我使用:

http.httpBasic()
    .and()
    .authorizeRequests()
    .anyRequest()
    .authenticated();

那么只有 spring security 会保护 url。为什么 antMatcher 不起作用?

(更新了标题以包含实际问题。)


原帖:

我提到了以下 *** 问题:

    Spring REST security - Secure different URLs differently

    Using multiple WebSecurityConfigurerAdapter with different AuthenticationProviders (basic auth for API and LDAP for web app)

和 spring 安全文档:

https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#multiple-httpsecurity

但我无法配置多个 http 安全元素。 当我遵循官方 spring 文档时,它在我的情况下有效,只是因为第二个 http 安全元素是一个包罗万象的事实,但是一旦我添加了一个特定的 url,所有的 url 都可以在没有任何身份验证的情况下访问。

这是我的代码:

@EnableWebSecurity
@Configuration
public class SecurityConfig 

    @Bean                                                             
    public UserDetailsService userDetailsService() throws Exception 
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("user").password("userPass").roles("USER").build());
        manager.createUser(User.withUsername("admin").password("adminPass").roles("ADMIN").build());
        return manager;
    


    @Configuration
    @Order(1)                                                        
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter 

        @Override       
        public void configure(AuthenticationManagerBuilder auth) 
          throws Exception             
            auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");
            auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN");
        

        protected void configure(HttpSecurity http) throws Exception 
            http
                .antMatcher("/api/v1/**")                               
                .authorizeRequests()
                .antMatchers("/api/v1/**").authenticated()
                    .and()
                .httpBasic();
        
    

    @Configuration
    @Order(2)
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter 

        @Override       
        public void configure(AuthenticationManagerBuilder auth) 
          throws Exception 

            auth.inMemoryAuthentication().withUser("user1").password("user").roles("USER");
            auth.inMemoryAuthentication().withUser("admin1").password("admin").roles("ADMIN");
        

        @Override
        protected void configure(HttpSecurity http) throws Exception 
            http
                .antMatcher("/api/test/**")
                .authorizeRequests()
                .antMatchers("/api/test/**").authenticated()
                    .and()
                .formLogin();
        
    

现在可以访问任何网址。如果我从第二个配置中删除 antMatcher,所有 url 都会变得安全。

【问题讨论】:

只要移除/添加 antMatcher,相同的 url 就会变得安全和不安全。例如如果我访问 localhost:8100/api/test/hello,只有在没有 antMatcher 行时才会提示我输入用户名密码。 api 是我的上下文根。我试过starstartest/starstar,但它也不起作用(使用wildchar * word star。*** android应用正在将wildchar转换为粗体格式。在测试之前和之后使用双星/) 【参考方案1】:

模式不能包含上下文路径,见AntPathRequestMatcher:

将预定义的 ant 样式模式与 HttpServletRequest 的 URL (servletPath + pathInfo) 进行比较的匹配器。

HttpServletRequest.html#getServletPath:

返回此请求的 URL 中调用 servlet 的部分。此路径以“/”字符开头,包括 servlet 名称或 servlet 路径,但不包括任何额外的路径信息或查询字符串。与 CGI 变量 SCRIPT_NAME 的值相同。

HttpServletRequest.html#getContextPath:

返回请求 URI 中指示请求上下文的部分。上下文路径始终位于请求 URI 的首位。路径以“/”字符开头,但不以“/”字符结尾。对于默认(根)上下文中的 servlet,此方法返回“”。容器不解码此字符串。

您修改和简化的代码:

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .antMatcher("/test/**")
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin();
    

【讨论】:

以上是关于Spring security antMatcher 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 在运行时动态添加/删除 antMatchers 和角色

Spring security antMatcher 未按预期工作

Spring Security:antMatcher 的序列未按预期工作 [重复]

Spring Security:所有端点返回状态 200 并且对约束没有响应作为 antMatchers

Spring security antMatchers permitAll 不起作用

使用 AngularJS 和 Spring Security 的单页应用程序中需要 AntMatchers