Estou tentando configurar o captcha, conforme este link, mas não consegui. A configuração é por xml e a configuração aqui é por aquivos java. Como fazer ?
Estou tentando configurar o captcha, conforme este link, mas não consegui. A configuração é por xml e a configuração aqui é por aquivos java. Como fazer ?
Um pré-requisito do texto é ter o Spring Security configurado. Você já fez?
Onde está <bean>
no XML você pode criar um método que retorna o objeto e tem a anotação @Bean
.
@Bean
public ReCaptchaAuthenticationFilter captcha(AuthenticationManager authenticationManager) {
ReCaptchaAuthenticationFilter recaptcha = new ReCaptchaAuthenticationFilter();
recaptcha.setAuthenticationManager(authenticationManager);
recaptcha.setFilterProcessesUrl("/authentication");
recaptcha.setPrivateKey("your_private_recaptcha_key");
SavedRequestAwareAuthenticationSuccessHandler success = new SavedRequestAwareAuthenticationSuccessHandler();
success.setAlwaysUseDefaultTargetUrl(true);
success.setDefaultTargetUrl("/home");
recaptcha.setAuthenticationSuccessHandler(success);
SimpleUrlAuthenticationFailureHandler failure = new SimpleUrlAuthenticationFailureHandler();
failure.setDefaultFailureUrl("/login?error=1");
recaptcha.setAuthenticationFailureHandler(failure);
return recaptcha;
}
Spring security, já está configurado no projeto.
Tenho dois arquivos:
primeiro:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {
E este:
package br.com.netsoft;
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
public class SpringWebSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
}
Ele reclama desta linha do que você informou.
ReCaptchaAuthenticationFilter, Entendo que esteja faltando esta classe.
Ah, a classe pede alguns argumentos no construtor:
public RecaptchaAuthenticationFilter(
RecaptchaValidator recaptchaValidator,
RecaptchaProperties recaptcha,
LoginFailuresManager failuresManager
)
Está diferente do POST!
Não entendi....
No código do blog que você colocou no início, não tinha esse construtor.
A ta, então eu poderia usar o exemplo do link que postei ?
Isso!
Essa classe:
public class ReCaptchaAuthenticationFilter extends UsernamePasswordAuthenticationFilter implements InitializingBean
{
private final String CAPTCHA_CHALLENGE_FIELD = "recaptcha_challenge_field";
private final String CAPTCHA_RESPONSE_FIELD = "recaptcha_response_field";
private final ReCaptchaImpl reCaptcha;
private String privateKey;
private final Logger log = LoggerFactory.getLogger(ReCaptchaAuthenticationFilter.class);
public ReCaptchaAuthenticationFilter() {
this.reCaptcha = new ReCaptchaImpl();
}
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException
{
String reCaptchaChallenge = request.getParameter(CAPTCHA_CHALLENGE_FIELD);
String reCaptchaResponse = request.getParameter(CAPTCHA_RESPONSE_FIELD);
String remoteAddress = request.getRemoteAddr();
if (!StringUtils.isEmpty(reCaptchaChallenge))
{
log.debug("ReCaptcha Challenge not null");
if (!StringUtils.isEmpty(reCaptchaResponse))
{
log.debug("ReCaptcha Answser not null, call ReCaptcha to verify it");
ReCaptchaResponse reCaptchaCheck = reCaptcha.checkAnswer(remoteAddress, reCaptchaChallenge, reCaptchaResponse);
if (reCaptchaCheck.isValid())
{
log.debug("ReCaptcha answer is valid, attempt authentication");
return super.attemptAuthentication(request, response);
}
else
{
this.reCaptchaError(request, response, "ReCaptcha failed : " + reCaptchaCheck.getErrorMessage());
return null;
}
}
else
{
this.reCaptchaError(request, response, "ReCaptcha failed : empty answer");
return null;
}
}
else
{
return super.attemptAuthentication(request, response);
}
}
private void reCaptchaError(HttpServletRequest request, HttpServletResponse response, String errorMsg)
{
log.error("ReCaptcha failed : " + errorMsg);
try
{
RequestDispatcher dispatcher = request.getRequestDispatcher("/login?error=2");
dispatcher.forward(request, response);
}
catch (ServletException e)
{
throw new AuthenticationServiceException("ReCaptcha failed : " + errorMsg);
}
catch (IOException e)
{
throw new AuthenticationServiceException("Recaptcha failed : " + errorMsg);
}
}
public void setPrivateKey(String privateKey)
{
this.privateKey = privateKey;
}
public void afterPropertiesSet()
{
if (StringUtils.isEmpty(this.privateKey))
{
throw new IllegalArgumentException("The 'privateKey' should be set for the bean type 'ReCaptchaAuthenticationFilter'");
}
else
{
reCaptcha.setPrivateKey(this.privateKey);
}
}
}
Consegui não...
A sua classe dá erro na própria classe e em outras classes deste código do git.
Alguma ajuda ?