Spring Security: пользовательская реализация CSRF за счет расширения CsrfRepository - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь создать настраиваемую реализацию CSRF в своем приложении Spring Boot, реализуя интерфейс CsrfRepository, предоставляемый Spring Security.

Ниже показано, как выглядит мой настраиваемый репозиторий:

public class CustomCookieCsrfTokenRepository implements CsrfTokenRepository {

    static final String DEFAULT_CSRF_COOKIE_NAME = "XSRF-TOKEN";

    static final String DEFAULT_CSRF_PARAMETER_NAME = "_csrf";

    static final String DEFAULT_CSRF_HEADER_NAME = "X-XSRF-TOKEN";

    @Override
    public CsrfToken generateToken(HttpServletRequest request) {
        return new DefaultCsrfToken(this.DEFAULT_CSRF_HEADER_NAME, this.DEFAULT_CSRF_PARAMETER_NAME, createNewToken());
    }

    @Override
    public void saveToken(CsrfToken token, HttpServletRequest request, HttpServletResponse response) {
        String tokenValue = token == null ? "" : token.getToken();
        Cookie cookie = new Cookie(this.DEFAULT_CSRF_COOKIE_NAME, tokenValue);
        cookie.setSecure(request.isSecure());
        response.addCookie(cookie);
    }

    @Override
    public CsrfToken loadToken(HttpServletRequest request) {
        Cookie cookie = WebUtils.getCookie(request, this.DEFAULT_CSRF_COOKIE_NAME);
        if (cookie == null) {
            return null;
        }
        String token = cookie.getValue();
        if (!StringUtils.hasLength(token)) {
            return null;
        }
        return new DefaultCsrfToken(this.DEFAULT_CSRF_HEADER_NAME, this.DEFAULT_CSRF_PARAMETER_NAME, token);
    }

    private String createNewToken() {
        String unsignedToken = UUID.randomUUID().toString();
        return RSAUtil.signMessage(unsignedToken, privateKey);
    }
}

ВОПРОС : Как вы можете видеть, я хочу подписать значение cookie с помощью личного ключа и проверить его с помощью открытого ключа.Вопрос в том, где должна иметь место эта логика проверки?Я предполагаю, что loadToken() метод может иметь логику для проверки подписи.Это правильное место или оно должно быть где-то в другом месте?

Может ли кто-нибудь предоставить отрывки или образцы того, как и где справиться с этим?

...