无法将 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 所说)。
我正在尝试将 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 所说)。