Spring Security antMatcher不起作用
我进一步深入研究了该问题,结果发现即使使用单个配置,问题仍然存在。如果我使用单一配置并保留
http.antMatcher("/api/test/**")网址不安全。删除antMatcher和antMatchers会立即保护URL。即如果我使用:
http.httpBasic()    .and()
    .authorizeRequests()
    .anyRequest()
    .authenticated();
那么只有spring安全性可以保护网址。antMatcher为什么不起作用?
(已更新标题以包括实际问题。)
和春季安全文档:
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();
        }
    }
}
现在可以访问任何URL。如果我从第二个配置中删除antMatcher,则所有URL都将得到保护。
回答:
该模式不能包含上下文路径,请参见AntPathRequestMatcher:
匹配器,用于将预定义的蚂蚁风格模式与的URL(
servletPath+pathInfo)相比较HttpServletRequest。
和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不起作用 的全部内容, 来源链接: utcz.com/qa/435266.html








