Меня попросили поработать в новом правиле во время процесса входа пользователя, теперь нам придется изменять процесс входа в систему всякий раз, когда приходит запрос с новым параметром, называемым «код». Все работает хорошо, но в конце мы должны изменить имя пользователя и пароль, отправленные в запросе. Моей первой попыткой было перехватить запрос в фильтре, а затем изменить его, но внесенные изменения не отражаются в методе «совпадения» моего класса PasswordEncoder, почему? Это мои классы:
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends OAuth2AuthorizationServerConfiguration {
// ...
public FilterRegistrationBean oauth2ClientFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.addUrlPatterns("/oauth/token");
registration.setFilter(new OAuth2ClientContextFilter(){
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
Optional.ofNullable(servletRequest.getParameter("code")).ifPresent(code -> {
try {
LoginGovServletRequestWrapper requestWrapper = new LoginGovServletRequestWrapper((HttpServletRequest)servletRequest);
requestWrapper.addUsernameAndPassword(loginGovService.getUsernameAndPasswordFromCode(code));
// tried super.doFilter(... too
chain.doFilter(requestWrapper, servletResponse);
} catch (Exception e){
throw new GenericException("Ocorreu um erro no processamento do code.", e);
}
});
super.doFilter(servletRequest, servletResponse, chain);
}
});
registration.setOrder(80);
return registration;
}
// ...
}
public class LoginGovServletRequestWrapper extends HttpServletRequestWrapper {
private HashMap params = new HashMap();
public LoginGovServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
// When debugging this part is not being called!!!
if (params.get(name) != null) {
return (String) params.get(name);
}
HttpServletRequest req = (HttpServletRequest) super.getRequest();
return req.getParameter(name);
}
public void addUsernameAndPassword(Map usernameAndPasswordFromCode) {
params.putAll(usernameAndPasswordFromCode);
}
}
public class CustomPasswordEncoder implements PasswordEncoder {
@Autowired
EnRhService enRhService;
@Override
public String encode(CharSequence rawPassword) {
return String.valueOf(rawPassword);
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
// Here the "rawPassword" is coming the old password, not the new replaced password...
String senhaDcripto = enRhService.decriptografarSenha(encodedPassword);
boolean match = rawPassword.toString().equalsIgnoreCase(senhaDcripto);
if (!match) {
throw new BadPasswordException(BadPasswordException.ERR_MESSAGE);
}
return match;
}
}
Обратите внимание, что перезаписанный метод "getParameter" в классе LoginGovServletRequestWrapper никогда не вызывается во время моих отладок, кажется, что spring игнорирует его, почему?