无法将 Spring 安全性应用于 Java 项目

Cannot apply Spring Security to a Java project

我正在尝试将 Prevent Brute Force Authentication Attempts with Spring Security 应用到我的 Java 项目,我也在其中使用 Spring Boot.但是,有一部分使用了web.xml,但我的项目中没有web.xml。那么,是否可以将该方法应用于 Spring 没有 web.xml 的引导项目?

我也尝试添加它的 maven 依赖项,但似乎没有。那么,我该如何应用呢?或者是否有类似的方法可以建议 Java + Spring 引导项目?我看着 Baeldung,但没有。有什么想法吗?

更新: 另一方面,我实现了除 web.xml 之外的所有 类,我想也许没有必要使用 web.xml 因为我已经正常将登录请求传递给我的服务。

但是,我的服务无法检测失败的登录尝试。我是否应该从 userRepository.findByUsername() 方法中调用某些方法未找到用户?有什么想法吗?

注:https://github.com/Baeldung/spring-security-registration/tree/master/src/main/java/com/baeldung/security上还有一篇GitHub的文章。

@Service
@RequiredArgsConstructor
public class LoginServiceImpl implements LoginService {

    private final UserService userService;
    private final UserRepository userRepository;
    private final TokenService tokenService;
    private final PasswordEncoder passwordEncoder;
    private final LoginAttemptService loginAttemptService;
    private final HttpServletRequest request;

    @Override
    @LogExecution
    @Transactional
    public UserTokenDTO login(final LoginRequest request)
            throws JsonProcessingException, JOSEException {

        String ip = getClientIP();
        if (loginAttemptService.isBlocked(ip)) {
            throw new RuntimeException("blocked");
        }

        final User user = userRepository.findByUsername(request.getEmail())
                .orElseThrow(InvalidCredentialsException::new);

        
        final var userDTO = userService.findByUuid(user.getUuid());
        final var tokenDTO = tokenService.generateTokens(userDTO, true);
        return new UserTokenDTO(userDTO, tokenDTO);
    }

    private String getClientIP() {
        String xfHeader = request.getHeader("X-Forwarded-For");
        if (xfHeader == null){
            return request.getRemoteAddr();
        }
        return xfHeader.split(",")[0];
    }
}

如果你没有 web.xml,你必须在你的 spring 配置包中创建一个像这样的 class

@WebListener
public class YourContextListener extends RequestContextListener {
    [...]
}

如果 Spring 未检测到,您还可以添加 @Configuration 注释。

不幸的是我不能评论(没有足够的声誉),但在下面的 link 中解释了为什么你不能捕获 AutenticationFailureListener,你必须使用自定义 AuthenticationFailureHandler(正如 Pilpo 所说)。