springboot實(shí)現(xiàn)增加黑名單和白名單功能
題外話
關(guān)于黑名單和白名單功能,我覺得可以直接用linux服務(wù)器的iptables或nftables來實(shí)現(xiàn)黑名單和白名單功能。這兩個(gè)工具都是Linux系統(tǒng)上用于配置防火墻規(guī)則的命令行工具。
iptables:
描述: iptables 是一個(gè)用于配置IPv4數(shù)據(jù)包過濾規(guī)則的工具。它是Linux系統(tǒng)上最常用的防火墻工具之一。
命令示例:
- 添加黑名單規(guī)則:
sudo iptables -A INPUT -s <黑名單IP地址> -j DROP
- 添加白名單規(guī)則:
sudo iptables -A INPUT -s <白名單IP地址> -j ACCEPT
nftables:
描述: nftables 是一個(gè)用于配置網(wǎng)絡(luò)過濾和分類規(guī)則的框架,可以替代iptables。它支持IPv4和IPv6,并提供更靈活的語法。
命令示例:
- 添加黑名單規(guī)則:
sudo nft add rule ip filter input ip saddr <黑名單IP地址> drop
- 添加白名單規(guī)則:
sudo nft add rule ip filter input ip saddr <白名單IP地址> accept
在選擇使用哪個(gè)工具時(shí),您可以根據(jù)您的偏好以及系統(tǒng)是否已經(jīng)采用nftables來進(jìn)行選擇。新er版本的Linux系統(tǒng)通常更傾向于使用nftables。請(qǐng)注意,上述命令中的<黑名單IP地址>
和<白名單IP地址>
需要替換為實(shí)際的IP地址。
無論您選擇使用iptables還是nftables,都需要小心配置規(guī)則,以確保不會(huì)阻止您訪問服務(wù)器。在配置之前,請(qǐng)確保您了解防火墻規(guī)則的工作原理和影響。
或者像openai一樣使用cf防護(hù)也就是CloudFlare作為其服務(wù)的安全防護(hù)層。
這里就不講那么多題外話,開始我們的springboot實(shí)現(xiàn)黑名單和白名單功能
先講一下springboot實(shí)現(xiàn)黑白名單的原理,很簡(jiǎn)單,就是單純的實(shí)現(xiàn)filter,然后注冊(cè)到springboot里面,在filter里面進(jìn)行黑白名單的篩選
第一步:創(chuàng)建一個(gè)springboot項(xiàng)目
pom文件的依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
注意:由于我使用的是springboot3,它內(nèi)置的tomcat是10及其以上的。所以引入的依賴是jakarta,可能你們版本比較低的,可以使用javax
第二步:創(chuàng)建一個(gè)過濾器類
package org.cyl.test.fliter; import jakarta.servlet.*; import java.io.IOException; import java.util.Arrays; import java.util.List; public class BlackWhiteListFilter implements Filter { private List<String> blackList = Arrays.asList("blocked-ip1", "blocked-ip2"); private List<String> whiteList = Arrays.asList("127.0.0.1", "0:0:0:0:0:0:0:1"); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String clientIP = request.getRemoteAddr(); // 檢查黑名單 if (blackList.contains(clientIP)) { response.getWriter().write("Your IP is blacklisted."); return; } // 檢查白名單 if (!whiteList.contains(clientIP)) { response.getWriter().write("Your IP is not whitelisted."); return; } chain.doFilter(request, response); } // 可以實(shí)現(xiàn) init 和 destroy 方法,根據(jù)需要進(jìn)行處理 }
第三步:注冊(cè)config類:
package org.cyl.test.config; import org.cyl.test.fliter.BlackWhiteListFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class WebConfig { @Bean public FilterRegistrationBean<BlackWhiteListFilter> myFilter() { FilterRegistrationBean<BlackWhiteListFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new BlackWhiteListFilter()); registrationBean.addUrlPatterns("/*"); return registrationBean; } }
第四步:開始測(cè)試
在這里面編寫白名單和黑名單。由于每次請(qǐng)求都會(huì)經(jīng)過Filter,所以在這里面可以實(shí)現(xiàn)除了我設(shè)置的127.0.0.1和0:0:0:0:0:0:0:1之外,其他ip無法訪問的情況。
編寫controller類
package org.cyl.test.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/allowed-endpoint") public String sayHello(){ return "Hello"; } }
訪問localhost:8080/allowed-endpoint
結(jié)果如下:
修改白名單
再次訪問:
很簡(jiǎn)單就成功了。
到此這篇關(guān)于springboot實(shí)現(xiàn)增加黑名單和白名單功能的文章就介紹到這了,更多相關(guān)springboot 黑名單和白名單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中攔截器和動(dòng)態(tài)代理的區(qū)別詳解
在?Spring?Boot?中,攔截器和動(dòng)態(tài)代理都是用來實(shí)現(xiàn)功能增強(qiáng)的,所以在很多時(shí)候,有人會(huì)認(rèn)為攔截器的底層是通過動(dòng)態(tài)代理實(shí)現(xiàn)的,所以本文就來盤點(diǎn)一下他們兩的區(qū)別,以及攔截器的底層實(shí)現(xiàn)吧2023-09-09Java JVM字節(jié)碼指令集總結(jié)整理與介紹
本節(jié)將會(huì)著重介紹一下JVM中的指令集、Java是如何跨平臺(tái)的、JVM指令集參考手冊(cè)等內(nèi)容。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Java 根據(jù)貸款年限對(duì)應(yīng)利率計(jì)算功能實(shí)現(xiàn)解析
這篇文章主要介紹了Java 根據(jù)貸款年限對(duì)應(yīng)利率計(jì)算功能實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Spring AOP在web應(yīng)用中的使用方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Spring AOP在web應(yīng)用中的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring AOP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持
這篇文章主要介紹了SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解
這篇文章主要為大家詳細(xì)介紹了SpringMVC 表單驗(yàn)證的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Java實(shí)現(xiàn)高并發(fā)秒殺的幾種方式
高并發(fā)場(chǎng)景在現(xiàn)場(chǎng)的日常工作中很常見,本文主要介紹了Java實(shí)現(xiàn)高并發(fā)秒殺的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05