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

Spring Security多个URL规则集无法一起使用

南门建章
2023-03-14
问题内容

我有一个HTTP Spring Security配置,当我注释掉各个方面时似乎可以使用,但是当我将Spring
Security规则组合在一起时它不起作用,所以我知道问题不在于regexMatcher或,antMatcher而是与所应用的规则有关。组合。

这是我的Spring Security课程:

package com.driver.website.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.csrf.CsrfTokenRepository;
import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository;
import org.springframework.security.web.header.writers.StaticHeadersWriter;
import org.springframework.security.web.header.writers.frameoptions.XFrameOptionsHeaderWriter;
import org.springframework.security.web.util.matcher.RequestMatcher;

import javax.servlet.http.HttpServletRequest;
import java.security.AccessControlContext;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${widget.headers.xframeoptions.domains.allowed}")
    private String allowedXFrameOptions;

    @Value("${widget.headers.origins.allowed}")
    private String allowedOrigins;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // @formatter:off

        http.exceptionHandling().accessDeniedPage("/login")
                .and()
                .formLogin().loginPage("/login").defaultSuccessUrl("/myaccount", true).permitAll()
                .and()
                .authorizeRequests()
                .antMatchers("/**").permitAll();

        http.regexMatcher("^((?!(/widget|/assistedSearch)).)*$")
                .headers().frameOptions().disable()
                .regexMatcher("^((?!(/widget|/assistedSearch)).)*$")
                .headers()
                .xssProtection()
                .contentTypeOptions()
                .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS", "SAMEORIGIN"));

        http.antMatcher("/widget")
            .headers()
            .frameOptions()
            .disable()
            .antMatcher("/widget")
            .headers()
            .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS", "ALLOW-FROM " + allowedXFrameOptions));

        http.requestMatchers().antMatchers("/assistedSearch", "/widget")
            .and()
            .headers()
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Origin", allowedOrigins))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Methods", "GET, POST"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Headers", "Content-Type"));

        // @formatter:on
    }
}

规则应该是…

  • 对于所有网址,但不包括/ widget和/ assistedSearch,我们应添加SAMEORIGIN X-Frame-Options标头
  • 对于/widget端点,我们应该添加X-Frame-Options:ALLOW-FROM标头
  • 对于/widget/assistedSearch终点,我们应该添加Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers

正如我上面提到的,如果我注释掉For all urls规则集,那么其他两个将齐头并进,但是在不For all urls注释规则的情况下,没有任何标题出现。

有谁知道为什么会这样?如何在Spring Security中添加多个规则集,并用新规则集覆盖现有规则集?

我试过了

http.antMatcher("/widget")
    .headers()
    .frameOptions()
    .disable()

这似乎再次可以单独使用,但不能结合使用。

提前致谢!


问题答案:

您将覆盖以前的匹配器,请参阅HttpSecurity.html#antMatcher:

调用antMatcher(String)将覆盖以前调用mvcMatcher(String)}requestMatchers()antMatcher(String)regexMatcher(String),和requestMatcher(RequestMatcher)

和HttpSecurity.html#regexMatcher:

调用regexMatcher(String)将覆盖以前调用mvcMatcher(String)}requestMatchers()antMatcher(String)regexMatcher(String),和requestMatcher(RequestMatcher)

如果您需要多个配置HttpSecurity,请参阅Spring
Security Reference

我们可以配置多个HttpSecurity实例,就像我们可以具有多个<http>块一样。关键是要扩展WebSecurityConfigurationAdapter多次。例如,以下是对以开头的URL具有不同配置的示例/api/

>     @EnableWebSecurity
>     public class MultiHttpSecurityConfig {
>       @Autowired
>       public void configureGlobal(AuthenticationManagerBuilder auth) { 1
>           auth
>               .inMemoryAuthentication()
>                   .withUser("user").password("password").roles("USER").and()
>                   .withUser("admin").password("password").roles("USER",
> "ADMIN");
>       }
>  
>       @Configuration
>       @Order(1)                                                        2
>       public static class ApiWebSecurityConfigurationAdapter extends
> WebSecurityConfigurerAdapter {
>           protected void configure(HttpSecurity http) throws Exception {
>               http
>                   .antMatcher("/api/**")                               3
>                   .authorizeRequests()
>                       .anyRequest().hasRole("ADMIN")
>                       .and()
>                   .httpBasic();
>           }
>       }
>  
>       @Configuration                                                   4
>       public static class FormLoginWebSecurityConfigurerAdapter extends
> WebSecurityConfigurerAdapter {
>  
>           @Override
>           protected void configure(HttpSecurity http) throws Exception {
>               http
>                   .authorizeRequests()
>                       .anyRequest().authenticated()
>                       .and()
>                   .formLogin();
>           }
>       }
>     }


 类似资料:
  • 我有以下解析器规则: 和以下lexer规则: 有了上面的规则,我想能够写出下面的代码:

  • 3.4 运行规则分析 本节会给大家提供一个参考实例,用于告诉大家如何根据具体的业务实现自己的爬虫框架。 我们以公共规则中“阿里巴巴产品搜索”为例(这些公共的规则都在github.com/pholcus下面包含,大家可以参考下)。 package spider_lib // 基础包 import ( "github.com/PuerkitoBio/goquery"

  • 有时我们要对程序中一些 url 进行一个美化的操作,为了用户更方便的设置 url 美化功能,我们要应用下对我们应用的url 进行一个规则的设置, 如我们在portal应用下加上url.php配置文件,文件内容如下: <?php // +---------------------------------------------------------------------- // | ThinkC

  • 有时我们要对程序中一些 url 进行一个美化的操作,为了用户更方便的设置 url 美化功能,我们要应用下对我们应用的url 进行一个规则的设置, 如我们在portal应用下加上url.php配置文件,文件内容如下: <?php // +---------------------------------------------------------------------- // | ThinkC

  • swoole框架使用强规则来做URL映射。如下面的URL http://127.0.0.1/hello/index/ 将会映射到 apps/controllers/Hello.php 中的 Hello::index 方法。 自定义URL 修改 apps/configs/rewrite.php ,增加正则配置。具体使用方法请看示例。 $rewrite[] = array( 'regx' =

  • 一、本功能说明 可以自定义全站各功能模块的相关URL,以便更加符合SEO或者个性化需求 注意事项:   本功能只提供URL规则的管理,具体使用还需要模块支持自定义URL 二、子功能导航 1.添加规则 2.管理规则 三、功能详解 1.添加规则 1).如何进入本功能 导航栏 选择扩展 -> 菜单栏 选择URL规则管理 -> 添加规则 2).界面解释 点击后弹出如下界面 界面详述 1). url规则名称