我如何有效地禁止用户使用 Spring Web 应用程序
Posted
技术标签:
【中文标题】我如何有效地禁止用户使用 Spring Web 应用程序【英文标题】:How do i ban a user from a spring web application effectively 【发布时间】:2019-12-12 09:50:42 【问题描述】:我在前端使用 Angular 并在后端使用 Spring 构建了一个单页 Web 应用程序。它是一个社区网站,我希望能够以春天的方式禁止行为不端的用户。我已经搜索了 *** 以查看是否有关于此的线程,但我找不到。
我尝试构建这个功能是通过创建一个自定义的网络过滤器来过滤所有传入的请求并检查请求者的 ip 地址是否在被阻止的 ip 列表中。如果不是,则转发请求,但如果它在列表中,则返回错误响应。
这里是过滤器的代码和一个实现接口:
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()
这是实现接口的代码
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 状态代码非常优雅,我希望能够向用户发送回一条消息,说明他/她实际上已被禁止。
所以我的问题是;。实际上,我的意思是能够将错误消息发送回单页应用程序,然后可以显示给用户。我还想知道这是否是拒绝被禁止用户从 REST api 访问的最佳方法。我想知道是否有其他更有效的方法来实现这一点。
谢谢
编辑:这是我用来创建大部分代码https://www.baeldung.com/java-web-app-without-web-xml的教程
【问题讨论】:
关心解释为什么这个线程应该关闭?我认为这是一个有效的问题,并且对于希望能够在春季禁止/阻止 IP 地址的任何其他人来说也非常有用,因为在 SO 上没有关于此主题的其他问题。 你试过用这个 (docs.oracle.com/javaee/7/api/javax/servlet/http/…) 代替吗? @second 是的,与此同时,我发现了这个方法重载并已经实现了它:) 但无论如何感谢您的建议。 有很多方法可以实现访问限制。您有多个问题,您想知道意见和替代方案,但 *** 问题格式适用于具有特定答案的问题,而不是讨论。 考虑链接到您找到的相关问题,例如***.com/questions/12786123/… 【参考方案1】:有效的禁止是您执行检测的应用程序和实施该禁止的操作系统之间的合作努力。如果您要部署到 Linux,那么一个有效的策略是:
将易于解析的消息记录到审计日志文件中,说明将禁止用户并包含 IP 地址。对攻击者的 HTTP 响应可以包含合适的“再见”消息。
安装并配置fail2ban 以解析您的日志文件并实施禁令。它通过对防火墙规则进行本地修改来防止攻击者甚至与您的服务器建立网络连接。
【讨论】:
以上是关于我如何有效地禁止用户使用 Spring Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章