Han*_*ans 3 spring spring-security spring-boot
在利用 WebFlux 的最新 Spring Security 中,安全配置的工作方式如下:
\n\nSecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {\nhttp.authorizeExchange().pathMatchers("/**") ....\nRun Code Online (Sandbox Code Playgroud)\n\n之前有一个方法 hasIpAddress("xxx.xxx.xxx.xxx") 可以用来配置IP白名单,现在没有了。
\n\n如何为新的Spring Security Webflux指定IP白名单?
\n\n基于下面@\xc3\xb6zkan pakdil 的想法,这是我的代码,但 IP 过滤器不起作用 - 来自不在白名单上的 IP 的请求仍然可以通过。
\n\nprivate Mono<AuthorizationDecision> isAuthorizedIP(Mono<Authentication> authentication, AuthorizationContext context) {\n String ip = context.getExchange().getRequest().getRemoteAddress().getAddress().toString().replace("/", "");\n\n return authentication.map((a) -> new AuthorizationDecision(\n ipWhiteList.contains(ip))); \n}\nRun Code Online (Sandbox Code Playgroud)\n\nSecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) 抛出异常 {
\n\nhttp.authorizeExchange().anyExchange().access(this::isAuthorizedIP).and().oauth2Login();
\n\n返回 http.build();
\n\n}
\n我花了一段时间才弄清楚,但最终,我找到了一种可行的方法。请检查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
));
}
}
Run Code Online (Sandbox Code Playgroud)
并将您的 IP 列入白名单。
| 归档时间: |
|
| 查看次数: |
2378 次 |
| 最近记录: |