如何在Java开发过程中正确绕过reCAPTCHA



我在Java应用程序中使用reCAPTCHA,有一种类似于以下代码的方法:

登录请求:

public class LoginRequest {
@NotEmpty
private String token;

@NotEmpty
private String username;
@NotEmpty
private String password;
}

登录控制器:



public class LoginController {
private final Validator validator;
@Value("${isDevelopment}")
private boolean isDevelopment;
public LoginController(Validator validator) {
this.validator = validator;
}
public User login(LoginRequest request) {
if(isDevelopment || validator.isValid(request.token)) {
// ...
}
throw new InvalidTokenException();
}
}

在这种方法中,我想使用应用程序开发环境变量isDevelopment来绕过验证。然而,我不确定是否还有更优雅的方式。因为reCAPTCHA被广泛使用,并且很可能会有更好的标准用于此目的。如何在开发过程中绕过reCAPTCHA?

更新:这是我的Validator类:

@Component
@RequiredArgsConstructor
public class CaptchaValidator {
private final RecaptchaEnterpriseServiceClient client;
@Value("${enabled}")
private boolean isEnabled;
public boolean isValid(String token) {
// code omitted
}
}

从技术上讲,这样的设计没有错——这种方法正在被广泛使用。它被命名为Feature Flags,有第三方软件解决方案可以帮助开发人员处理此类变量(例如LaunchDarkly(。

从Objective Programming的角度来看,您也可以通过创建一些包装器接口(比如UserValidator(来处理这种情况,将其注入LoginController。。。

public class LoginController {
private final UserValidator validator;
public LoginController(UserValidator validator) {
this.validator = validator;
}
// ... 
public User login(LoginRequest request) {
if(validator.validate(request.token)) { 
// ...

使您的CaptchaValidator实现这一点,但也为接口创建一些dev存根(比如AlwaysTrueValidator(。然后在开发过程中,您可以使用存根,并在上线时更改配置。您甚至可以利用Spring配置文件的一些优势。

@Configuration
@Profile("production")
public class ProductionConfiguration {
@Bean
public LoginController loginController() {
return new LoginController(new CaptchaValidator());
}
}
// ...
@Configuration
@Profile("development")
public class DevelopmentConfiguration {
@Bean
public LoginController loginController() {
return new LoginController(new AlwaysTrueValidator());
}
}

最新更新