我已经在前端使用 Angular 并在后端使用 Spring 构建了一个单页 Web 应用程序。它是一个社区网站,我希望能够以 Spring 方式禁止行为不端的用户。我搜索了 stackoverflow 以查看是否有关于此的线程,但我找不到。
我尝试构建此功能是通过创建一个自定义 webfilter 来过滤所有传入的请求并检查请求者的 ip 地址是否在阻止的 ip 列表中。如果不在,则请求被转发,但如果它在列表中,则会发回错误响应。
过滤器的代码和实现接口(interface)如下:
package RequestPreprocessors;
import DAOs.BanDao;
import Interfaces.IpAddressExtractor;
import Services.ModeratorService;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;
import java.util.logging.Logger;
@WebFilter("/*")
public class IpAddressFilter implements Filter, IpAddressExtractor {
private static final Logger log = Logger.getLogger("IpAddressFilter.class");
private Set<String> blockedIpAddresses;
@Autowired
private ModeratorService moderatorService;
@PostConstruct
private void loadBlockedIpAddresses(){
blockedIpAddresses = moderatorService.getBlockedIpAddresses();
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String clientIpAddress = getClientIP((HttpServletRequest) servletRequest);
log.info("ip " + clientIpAddress + " is requesting " + httpServletRequest.getRequestURI());
if(blockedIpAddresses.contains(clientIpAddress)) {
log.info(clientIpAddress + " is currently on the banlist, aborting request...");
httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN);
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
这是实现接口(interface)的代码
public interface IpAddressExtractor {
public default String getClientIP(HttpServletRequest request) {
String xfHeader = request.getHeader("X-Forwarded-For");
if (xfHeader == null){
return request.getRemoteAddr();
}
return xfHeader.split(",")[0]; // voor als ie achter een proxy zit
}
}
这应该可行,但我认为发送一个简单的 http 状态代码不是很优雅,我希望能够发回一条消息,向用户解释他/她实际上被禁止了。
所以我的问题是;我如何有效地禁止用户使用 spring web 应用程序。有效地我的意思是能够将错误消息发送回单页应用程序,然后可以将其显示给用户。我还想知道这是否是拒绝被禁止用户从 REST api 访问的最佳方式。我想知道是否有不同的更有效的方法来实现这一目标。
谢谢
编辑:这是我用来创建大部分代码的教程 https://www.baeldung.com/java-web-app-without-web-xml
最佳答案
有效禁止是执行检测的应用程序与实现阻止的操作系统之间的合作努力。如果您要部署到 Linux,那么一个有效的策略是:
将一条易于解析的消息记录到审核日志文件中,说明用户将被禁止并包含 IP 地址。对攻击者的 HTTP 响应可以包含合适的“再见”消息。
安装和配置 fail2ban解析您的日志文件并实现禁令。它通过对防火墙规则进行本地修改来防止攻击者甚至与您的服务器建立网络连接。
关于java - 我如何有效地禁止用户使用 spring web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348987/