Spring Security配置中的单个角色多个IP地址

时间:2017-06-01 08:52:55

标签: java security spring-boot spring-security ip-address

在我的Spring Boot项目中,我试图访问具有特定IP地址的多个管理员用户。

是否可以将单个角色映射到多个IP地址?

以下是我的安全配置中的代码无效。 (为简单起见,我给出了硬编码的角色名称和IP地址)

cstring

我的请求的网址:http://localhost:9595/admin/checkappeals/211

2 个答案:

答案 0 :(得分:4)

您的for循环导致以下配置:

@SuppressWarnings("ALL")
@Configuration
@EnableWebSecurity
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .authorizeRequests()
                .antMatchers("/admin/**").access("hasRole('admin') and hasIpAddress('127.0.0.1')")
                .antMatchers("/admin/**").access("hasRole('admin') and hasIpAddress('192.168.1.0/24')")
                .antMatchers("/admin/**").access("hasRole('admin') and hasIpAddress('0:0:0:0:0:0:0:1')");
    }

    //some other configurations
}

对于URL:

http://localhost:9595/admin/checkappeals/211

仅考虑第一个匹配器,请参阅HttpSecurity#authorizeRequests

  

请注意,匹配器是按顺序考虑的。因此,以下内容无效,因为第一个匹配器匹配每个请求,并且永远不会进入第二个映射:

     
http.authorizeRequests().antMatchers("/**").hasRole("USER").antMatchers("/admin/**")
            .hasRole("ADMIN")

你必须建立类似的东西:

http
    .authorizeRequests()
        .antMatchers("/admin/**").acces("hasRole('admin') and (hasIpAddress('127.0.0.1') or hasIpAddress('192.168.1.0/24') or hasIpAddress('0:0:0:0:0:0:0:1'))";

答案 1 :(得分:0)

这是将逗号分隔的ip连接到.access()方法的表达式中的方法:

private String createHasIpRangeExpression() {

    String ipRanges= "127.0.0.1,192.168.1.0/24,0:0:0:0:0:0:0:1"
    List<String> validIps = Arrays.asList(ipRanges.split("\\s*,\\s*"));
    String hasIpRangeAccessExpresion = validIps.stream()
      .collect(Collectors.joining("') or hasIpAddress('", "hasIpAddress('","')"));
    return hasIpRangeAccessExpresion;
}