Как изменить параметры запроса во время аутентификации oAuth 2 Spring? - PullRequest
0 голосов
/ 20 января 2020

Меня попросили поработать в новом правиле во время процесса входа пользователя, теперь нам придется изменять процесс входа в систему всякий раз, когда приходит запрос с новым параметром, называемым «код». Все работает хорошо, но в конце мы должны изменить имя пользователя и пароль, отправленные в запросе. Моей первой попыткой было перехватить запрос в фильтре, а затем изменить его, но внесенные изменения не отражаются в методе «совпадения» моего класса 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 игнорирует его, почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...