spring security未正确拦截?

oknwwptz  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(401)

这个问题在这里已经有答案了

spring安全:多个http配置不工作(2个答案)
一年前关门了。
我有一个spring引导配置,它看起来像这样:

http
    .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
    .addFilterBefore( new Filter(), UsernamePasswordAuthenticationFilter.class)
    .csrf().disable() // Disabled, cause enabling it will cause sessions
    .headers()
        .frameOptions()
        .sameOrigin()
        .addHeaderWriter(new XXssProtectionHeaderWriter())
        .and()
    .authorizeRequests()
        .antMatchers("/app/**", "/rest/**").hasAuthority(DefaultPrivileges.ACCESS_TASK)
        .anyRequest().permitAll();

我的理解只是从 /app 或者 /rest 将被我的自定义过滤器截获,但结果是请求到根目录( http://localhost:8080/context/ )也被截获。
我有多种spring security配置,其他配置如下所示:

http
    .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
    .csrf().disable();

if (taskAppProperties.isRestEnabled()) {
    if (restAppProperties.isVerifyRestApiPrivilege()) {
        http
            .antMatcher("/*-api/**")
            .authorizeRequests()
                .antMatchers("/*-api/**").hasAuthority(DefaultPrivileges.ACCESS_REST_API)
                .and()
            .httpBasic();
    } else {
        http
            .antMatcher("/*-api/**")
            .authorizeRequests()
                .antMatchers("/*-api/**").authenticated()
                .and()
            .httpBasic();
    }
} else {
    http
        .antMatcher("/*-api/**")
        .authorizeRequests()
            .antMatchers("/*-api/**").denyAll();
}

有人能帮忙吗?

ghhaqwfi

ghhaqwfi1#

我知道这有点混乱,但实际上有两个 antMatchers 方法,从 authorizedRequests 另一个分支 requestMatchers .
让我们看看下面的声明:

http
    .requestMatchers()
        .antMatchers("/app/**", "/api/**")
        .and()
    .authorizeRequests()
        .antMatchers("...").authenticated()
    ...

这个 requestMatchers() dsl是描述与spring安全过滤器链示例相关的端点的地方。因此,这个过滤器链只会对以 /app 或者 /api .
我们再来看看另一个:

http
    .authorizeRequests()
    .antMatchers("/app/**", "/api/**")
    .authenticated();

虽然这看起来是在做同样的事情,但事实并非如此。那是因为你打电话给 antMatchers 属于的方法 authorizeRequests() .
这就是为什么indentation对于spring security dsl很重要。因为dsl中有一个层次结构,所以你想缩进,就像你想缩进你的文档一样 if 声明。
在SpringSecurity5.2中,新的lambda dsl简化了一点:

http
    .requestMatchers(r -> r.antMatchers("/app/**", "/api/**"))
    .authorizeRequests(a -> a.antMatchers("...").authenticated());
d4so4syb

d4so4syb2#

HttpSecurity.authorizeRequests -退货 ExpressionInterceptUrlRegistry 我们在这里设置匹配器和角色条件,将使用方法添加这些条件 ExpressionInterceptUrlRegistry.getRegistry 如果你只在 permitAll 发生实际身份验证的存根。

我们添加的过滤器使用 HttpSecurity.addFilterBefore 不会检查任何匹配的请求。如果需要,可以在自定义过滤器中再执行一次检查,以避免其他uri

http
  .sessionManagement()
  .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  .and()
  .addFilterAfter( new Filter() {
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {

      }

      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
          HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
          if(httpServletRequest.getRequestURI().startsWith("/app/") || httpServletRequest.getRequestURI().startsWith("/rest/")) {
              // Do you secured filter computations

          } 
          chain.doFilter(request, response);
      }

      @Override
      public void destroy() {

      }}, UsernamePasswordAuthenticationFilter.class)
  .csrf()
  .disable() // Disabled, cause enabling it will cause sessions
  .headers()
  .frameOptions()
  .sameOrigin()
  .addHeaderWriter(new XXssProtectionHeaderWriter())
  .and()
  .authorizeRequests()
  .antMatchers("/app/**", "/rest/**")
  .hasAuthority(DefaultPrivileges.ACCESS_TASK)
  .anyRequest()
  .permitAll();

相关问题