将 spring 中的 tomcat 限制为某些 IP 地址的引导
Restrict tomcat in spring boot to certain ip addresses
我需要将 spring 基于引导的应用程序的嵌入式 tomcat 限制为某些 IP 地址。我只想允许来自两个 IP 地址的传入连接,而不是全部。
我知道如何在未嵌入运行的 tomcat 中执行此操作,但不知道如何在 spring 引导中进行配置。各种 server.tomcat.*
属性似乎不对此提供支持。有属性 server.address
使我能够绑定到本地 ip 地址,但这不是我需要的。
找到此答案以寻找相同的解决方案。这是在 Spring Boot 中执行此操作的更准确方法。
@Bean
public FilterRegistrationBean remoteAddressFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
RemoteAddrFilter filter = new RemoteAddrFilter();
filter.setAllow("192.168.0.2");
filter.setDenyStatus(404);
filterRegistrationBean.setFilter(filter);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
默认响应是 403。要将其更改为 404,请添加 filter.setDenyStatus(404);
您也可以使用 filter.setDeny("192\.168\.0\.2");
设置拒绝地址
如果您想添加多个 IP 地址,那么您可以使用 Spring 安全和自定义身份验证提供程序来实现。自定义Authentication Provider配置如下:
@Component
public class CustomIpAuthenticationProvider implements AuthenticationProvider {
Set<String> whitelist = new HashSet<String>();
public CustomIpAuthenticationProvider() {
whitelist.add("103.219.56.22");
whitelist.add("192.168.2.33");
}
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException {
WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
String userIp = details.getRemoteAddress();
if(! whitelist.contains(userIp)) {
throw new BadCredentialsException("Invalid IP Address");
}
}
}
和 Spring 安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomIpAuthenticationProvider authenticationProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and().formLogin().permitAll()
.and().csrf().disable();
}
}
或者如果您只想从某些特定的 IP 地址访问某些特定的映射,那么 Spring 安全配置如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/rockstar/**").hasIpAddress("103.219.55.22")
.anyRequest().authenticated()
.and()
.formLogin().permitAll()
.and()
.csrf().disable();
}
}
我需要将 spring 基于引导的应用程序的嵌入式 tomcat 限制为某些 IP 地址。我只想允许来自两个 IP 地址的传入连接,而不是全部。
我知道如何在未嵌入运行的 tomcat 中执行此操作,但不知道如何在 spring 引导中进行配置。各种 server.tomcat.*
属性似乎不对此提供支持。有属性 server.address
使我能够绑定到本地 ip 地址,但这不是我需要的。
找到此答案以寻找相同的解决方案。这是在 Spring Boot 中执行此操作的更准确方法。
@Bean
public FilterRegistrationBean remoteAddressFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
RemoteAddrFilter filter = new RemoteAddrFilter();
filter.setAllow("192.168.0.2");
filter.setDenyStatus(404);
filterRegistrationBean.setFilter(filter);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
默认响应是 403。要将其更改为 404,请添加 filter.setDenyStatus(404);
您也可以使用 filter.setDeny("192\.168\.0\.2");
如果您想添加多个 IP 地址,那么您可以使用 Spring 安全和自定义身份验证提供程序来实现。自定义Authentication Provider配置如下:
@Component
public class CustomIpAuthenticationProvider implements AuthenticationProvider {
Set<String> whitelist = new HashSet<String>();
public CustomIpAuthenticationProvider() {
whitelist.add("103.219.56.22");
whitelist.add("192.168.2.33");
}
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException {
WebAuthenticationDetails details = (WebAuthenticationDetails) auth.getDetails();
String userIp = details.getRemoteAddress();
if(! whitelist.contains(userIp)) {
throw new BadCredentialsException("Invalid IP Address");
}
}
}
和 Spring 安全配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomIpAuthenticationProvider authenticationProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and().formLogin().permitAll()
.and().csrf().disable();
}
}
或者如果您只想从某些特定的 IP 地址访问某些特定的映射,那么 Spring 安全配置如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/rockstar/**").hasIpAddress("103.219.55.22")
.anyRequest().authenticated()
.and()
.formLogin().permitAll()
.and()
.csrf().disable();
}
}