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 白名单的主要内容,如果未能解决你的问题,请参考以下文章
Spring Webflux Security 中的角色层次结构
将 spring-security 与 spring-webflux 一起使用时禁用 WebSession 创建
在 Spring WebFlux 中使用 Spring Security 实现身份验证的资源是啥
Spring WebFlux + Security - 我们有“记住我”功能吗?
如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?