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

How to bypass reCAPTCHA properly during development in Java

我在我的 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 class:

@Component
@RequiredArgsConstructor
public class CaptchaValidator {

    private final RecaptchaEnterpriseServiceClient client;

    @Value("${enabled}")
    private boolean isEnabled;

    public boolean isValid(String token) {
      // code omitted
    }
}

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

从 Objective 编程的角度来看,您还可以通过创建一些包装器接口(比如 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 profiles.

@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());
    }
}