java - 我如何有效地禁止用户使用 spring web 应用程序

标签 java spring servlet-filters servlet-3.0

我已经在前端使用 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,那么一个有效的策略是:

  1. 将一条易于解析的消息记录到审核日志文件中,说明用户将被禁止并包含 IP 地址。对攻击者的 HTTP 响应可以包含合适的“再见”消息。

  2. 安装和配置 fail2ban解析您的日志文件并实现禁令。它通过对防火墙规则进行本地修改来防止攻击者甚至与您的服务器建立网络连接。

关于java - 我如何有效地禁止用户使用 spring web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348987/

相关文章:

java - 如何在 Spring boot FilterHandlerFunction 提交之前处理响应

java.lang.Class 泛型和通配符

java - java中什么时候使用OR,什么时候使用AND

java - 如何在单例类 Spring Boot 中使用服务(使用 "usual"类连接不同的服务)

java - 我们可以根据内容更改 log4j 日志记录级别吗

java - Servlet 过滤器与 ServletRequestListener

java - 使用 servlet 过滤器修改请求参数

java - 根据条件设置 JTable 单元格禁用或启用?

java - 我们可以对 View 进行 Spring 通用映射吗?

java - 我如何知道 HttpServletRequest 是否受 <security-constraint> 约束?