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