Keycloak, как обезопасить пружинную загрузочную часть, которая не обслуживает веб-страницы? - PullRequest
0 голосов
/ 23 января 2020

У меня есть интерфейс, который я защищал с помощью keycloak, когда наша страница входа в систему отправляла запрос POST на сервер Keycloak, чтобы я мог получить токен доступа (JWT). Мы не используем предоставленную kecloak страницу входа. Этот внешний интерфейс выполняет вызовы REST к сервлету (весенней загрузки), который использует эти вызовы для запроса базы данных и отправки данных обратно внешнему интерфейсу. В большинстве учебных пособий, которые я вижу по защите приложения для весенней загрузки, используется весенняя загрузка для обслуживания веб-страниц и используется страница входа по умолчанию в keycloak. У меня вопрос: как я могу использовать адаптер весенней загрузки keycloak, не используя страницу входа в keycloak? Есть ли способ, которым я могу передать маркер доступа keycloak в каждом запросе, эквивалентный тому, как может ожидать keycloak?

Я использую keycloak версии 7.0.0 и защищаю каждую конечную точку по роли.

Я следовал этому руководству в той степени, в которой это возможно, за исключением того, что мой @Controller используется по-другому и не использует никакие подпружиненные объекты Model для обслуживания веб-страниц, как упоминалось ранее. В настоящее время каждый запрос возвращает ошибку 500. Так что это привело меня к этому вопросу. https://www.thomasvitale.com/spring-boot-keycloak-security/

Спасибо!

1 Ответ

0 голосов
/ 23 января 2020

Этот вопрос очень широкий и не может вписаться в Stackoverflow, но, наконец, платформа Stackoverflow, чтобы помочь друг другу, поэтому вот одно из решений.

В вашем проекте api отдыха создайте функциональный класс Keycloak, который будет аутентифицировать все запрос на получение данных.

Давайте посмотрим на один случай. Предположим, я хочу создать роль в Keycloak и в моей БД, что мне нужно делать?

Предположим, запрос придет от клиента Rest или GUI - > Запрос должен содержать токен, чтобы каждый запрос имел действительный токен, поэтому ваш код для создания роли в БД Keycloak будет выглядеть примерно так

public void createRole(String createRoleAPIurl,String accessToken){
RoleRepresentation roleRepresentation = new RoleRepresentation();
roleRepresentation.setName(role.getRoleName());
roleRepresentation.setDescription(role.getDescription());
String convertValue = mapper.writeValueAsString(roleRepresentation);
StringEntity entity = new StringEntity(convertValue);
response = keycloakUtil.fetchURLResponse(createRoleAPIurl, accessToken, entity);
}

и

public CloseableHttpResponse fetchURLResponse(String createRoleAPIurl, String accessToken, StringEntity entity)
            throws IOException, ClientProtocolException {
        CloseableHttpResponse response = null;
        try {
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpPost postRequest = new HttpPost(url);
            postRequest.addHeader("Authorization", "bearer " + accessToken);
            postRequest.addHeader("content-type", "application/json");
            postRequest.setEntity(entity);
            response = httpclient.execute(postRequest);
        } catch (Exception e) {

        }
        return response;
    }

В этом примере запроса идет к Keycloak, поэтому URL будет похож на https://<PORT>:<IP>/auth/roles этот URL, например, в вашем случае вам нужно написать другой метод, который будет проверять токен, если токен будет проверен, тогда только вы позволите запросу извлекать данные из вашей БД, в противном случае Вы можете выбросить какое-то исключение или передать сообщение. Поэтому каждый ваш запрос должен сопровождаться действительным токеном, и теперь он обязан проверять токен, а затем разрешать доступ только к вашим ресурсам.

Надеюсь, он вам поможет.

...