Внедрите сервис аккаунта, оставьте шаблон для использования асинхронной задачи - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь реализовать служебные учетные записи, используя Keycloak и Spring boot, чтобы обеспечить выполнение асинхронной запланированной задачи.

Я думаю, что это нужно, потому что иначе у меня нет полномочий для доступа к моему сервису.

Вот руководство по брелку: https://www.keycloak.org/docs/latest/server_admin/index.html#_service_accounts

Я пробовал что-то вроде:

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
    map.add("grant_type", "client_credentials");

    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);


    ResponseEntity<String> response = keycloakRestTemplate.postForEntity(URI.create("http://MYURL/auth/realms/MYREALM/protocol/openid-connect/token"), request , String.class );

Но я получаю эту ошибку:

org.springframework.web.client.HttpClientErrorException: 400 Bad Request
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:85) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:708) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:661) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:636) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:431) ~[spring-web-4.3.14.RELEASE.jar:4.3.14.RELEASE]

Это моя конфигурация безопасности:

    Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {  

    @Value("${app.mux}")
    private String mux; 

    @Autowired
    public KeycloakClientRequestFactory keycloakClientRequestFactory;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
            ..................
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(keycloakAuthenticationProvider());
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public KeycloakRestTemplate keycloakRestTemplate() {
        return new KeycloakRestTemplate(keycloakClientRequestFactory);
    }

    @Bean
    public KeycloakConfigResolver keycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    public FilterRegistrationBean keycloakAuthenticationProcessingFilterRegistrationBean(KeycloakAuthenticationProcessingFilter filter) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
        registrationBean.setEnabled(false);
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean keycloakPreAuthActionsFilterRegistrationBean(KeycloakPreAuthActionsFilter filter) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
        registrationBean.setEnabled(false);
        return registrationBean;
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web
           .ignoring()
           .antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**", "/webjars/**");
    }

So how can I implement a request like above?

1 Ответ

0 голосов
/ 29 апреля 2018

Вам также нужны client_id и client_secret, чтобы выполнить аутентификацию как службу (я полагаю, ваш тип клиента является конфиденциальным). Из спецификации Oauth2 :

2.3.1. Пароль клиента

Клиенты, владеющие паролем клиента, МОГУТ использовать HTTP Basic
схема аутентификации, как определено в [RFC2617] для аутентификации с
сервер авторизации. Идентификатор клиента кодируется с использованием Алгоритм кодирования "application / x-www-form-urlencoded" в Приложении B, и закодированное значение используется в качестве имени пользователя; клиент пароль кодируется с использованием того же алгоритма и используется как
пароль. Сервер авторизации ДОЛЖЕН поддерживать HTTP Basic
схема аутентификации для аутентификации клиентов, которым выдан
пароль клиента.

Например (с дополнительными разрывами строк только для отображения):

Авторизация: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3

В качестве альтернативы, сервер авторизации МОЖЕТ поддерживать, включая
учетные данные клиента в теле запроса с использованием следующего
Параметры:

client_id ТРЕБУЕТСЯ. Идентификатор клиента, выданный клиенту во время процесс регистрации описан в разделе 2.2.

client_secret ТРЕБУЕТСЯ. Секрет клиента. Клиент МОЖЕТ опустить параметр, если секретный ключ клиента является пустой строкой.

Добавьте их в свой код:

map.add("client_id", "my_application");
map.add("client_secret", "" /*Provide the value given by keycloak*/);

Вы можете получить автоматически сгенерированный секретный ключ клиента или даже изменить его из панели администратора :

enter image description here

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