Spring Security WebFlux IP 白名单

Posted

技术标签:

【中文标题】Spring Security WebFlux IP 白名单【英文标题】:Spring Security WebFlux IP Whitelist 【发布时间】:2020-04-13 17:36:57 【问题描述】:

在利用 WebFlux 的最新 Spring Security 中,安全配置如下所示,

SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) 
http.authorizeExchange().pathMatchers("/**") ....

之前有一个方法 hasIpAddress("xxx.xxx.xxx.xxx") 可以用来配置IP白名单,现在没有了。

如何为新的 Spring Security Webflux 指定 IP 白名单?

根据下面@özkan pakdil 的想法,这是我的代码,但 IP 过滤器不起作用 - 来自不在白名单上的 IP 的请求仍然可以通过。

private Mono<AuthorizationDecision> isAuthorizedIP(Mono<Authentication> authentication, AuthorizationContext context) 
    String ip = context.getExchange().getRequest().getRemoteAddress().getAddress().toString().replace("/", "");

    return authentication.map((a) -> new AuthorizationDecision(
                                        ipWhiteList.contains(ip)));     

SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) 抛出异常

http.authorizeExchange().anyExchange().access(this::isAuthorizedIP).and().oauth2Login();

返回 http.build();

【问题讨论】:

【参考方案1】:

我花了一段时间才弄清楚,但最后,我找到了一种可行的方法。请检查 https://github.com/ozkanpakdil/spring-examples/tree/master/webflux-ip-whitelist 并告诉我这是否没有帮助。

你可以像这样定义 WebSecurityConfig

import org.springframework.context.annotation.Bean;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.security.web.server.authorization.AuthorizationContext;
import reactor.core.publisher.Mono;

import java.util.ArrayList;

@EnableWebFluxSecurity
public class WebSecurityConfig 

    ArrayList<String> whiteListIp = new ArrayList();

    public WebSecurityConfig() 
        whiteListIp.add("0:0:0:0:0:0:0:1");
        whiteListIp.add("192.168.1.1");
        whiteListIp.add("127.0.0.1");
    

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) 
        http
                .authorizeExchange()
                .anyExchange()
                .access(this::whiteListIp)
                .and()
                .httpBasic();

        return http.build();
    

    private Mono<AuthorizationDecision> whiteListIp(Mono<Authentication> authentication, AuthorizationContext context) 
        String ip = context.getExchange().getRequest().getRemoteAddress().getAddress().toString().replace("/", "");
        return authentication.map((a) -> new AuthorizationDecision(a.isAuthenticated()))
                .defaultIfEmpty(new AuthorizationDecision(
                        (whiteListIp.contains(ip)) ? true : false
                ));
    


并将您的 IP 列入白名单。

【讨论】:

感谢您的意见。根据您的想法,我用我的代码更新了帖子,但 IP 过滤器不起作用。 如果你把你的项目放到github上我可以看看。 我运行的代码几乎与您的示例相同。看起来代码是这样工作的,当白名单包含源 IP 时,它会跳过 HTTP 基本身份验证;如果源 IP 不在白名单中,那么它将进行基本身份验证。我期望的是,如果源 IP 在白名单中,则进行基本身份验证;如果不在白名单中,则给出 401 错误。如何做到这一点?

以上是关于Spring Security WebFlux IP 白名单的主要内容,如果未能解决你的问题,请参考以下文章

WebFlux Spring Security配置

Spring Webflux Security 中的角色层次结构

将 spring-security 与 spring-webflux 一起使用时禁用 WebSession 创建

在 Spring WebFlux 中使用 Spring Security 实现身份验证的资源是啥

Spring WebFlux + Security - 我们有“记住我”功能吗?

如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?