【问题标题】:How to bypass reCAPTCHA properly during development in Java在 Java 开发过程中如何正确绕过 reCAPTCHA
【发布时间】:2021-09-22 06:58:51
【问题描述】:

我在我的 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
    }
}

【问题讨论】:

    标签: java spring recaptcha invisible-recaptcha recaptcha-v3


    【解决方案1】:

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

    从目标编程的角度来看,您还可以通过创建一些包装接口(比如说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());
        }
    }
    

    【讨论】:

    • 非常感谢您的精彩解释。实际上 Spring 配置文件看起来不错且专业,但据我所知,另一种方法(在 application.yml 中使用环境变量)对我也有好处。
    • 我有一个关于wrapper interface问题。我使用了一个名为UserValidator 的类,并且我已经将它注入到我的LoginController 中(我更新了省略的部分,请参阅LoginController。在这个阶段,我应该将此UserValidator 类转换为接口,还是可以继续将其用作课程。您有什么建议?
    • 我会说在 Java 中选择接口应该始终是默认选择。因为您的情况确实与接口对齐,所以我会将此类转换为接口。
    • 对不起,但我不确定如何将其正确转换为接口。我在我的问题中添加了 myValidator 类作为更新。你能把它转换成界面吗?我想我创建了一个Validator 接口及其实现称为ValidatorImpl,但无法正确实现它们。类及其接口的任何示例?
    • 实际上您发布的不是Validator 类,而是实际实现(即使isValid 方法为空):) 我建议只使用一种方法@ 创建接口public interface Validator 987654340@(在这里你甚至可以让默认实现返回true btw),然后创建你的CaptchaValidator,它将implements Validator。您仍然可以有 Lombok 注释,但删除此 @Component 并使用方法 @Bean public Validator validator() { return new CaptchaValidator(...); } 创建 Java spring 配置类
    猜你喜欢
    • 2012-01-20
    • 2022-06-16
    • 2016-10-23
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多