Keycloak - Angular-Rest Integration - Роли всегда пусты - PullRequest
0 голосов
/ 09 января 2019

Когда я читаю об интеграции Keycloak с приложением Angular + REST, в основном я вижу подход с двумя клиентами, один общедоступный и один только для переноса. Это лучшее решение или я могу использовать один конфиденциальный клиент для обоих приложений. Я читал, что использование конфиденциального клиента для javascript - не лучший способ сделать это, так как невозможно скрыть секрет в javascript.

Кроме того, после интеграции keycloak в остальные и проект пользовательского интерфейса с использованием подхода двух клиентов, похоже, аутентификация работает. Но я не получаю никаких ролей в остальной части. Я использую адаптер безопасности Spring и Springboot 1.5.18 для бэкэнда. Моя версия сервера keycloak - 3.4.12, а версия адаптера keycloak spring - 3.4.3. Файлы конфигурации Keycloak также представлены ниже.

keycloak.json (угловой проект)

{
  "realm": "dev",
  "auth-server-url": "https://<keycloakserver> /auth",
  "resource": "frontend-dev",
  "public-client": true,
  "use-resource-role-mappings": true,
 "confidential-port": 0,
  "ssl-required": "external",
  "disable-trust-manager": true
}

application.properties (springboot)

keycloak.realm=dev
keycloak.bearer-only=true
keycloak.auth-server-url=https:// <keycloakserver> /auth
keycloak.resource= backend-dev
keycloak.use-resource-role-mappings=true
keycloak.credentials.secret=222-3333-4444-5555
#development only properties
keycloak.ssl-required=external
keycloak.disable-trust-manager=true

Keycloak Java конфигурация

@KeycloakConfiguration

@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)

public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {


 /**

  * Registers the KeycloakAuthenticationProvider with the authentication manager.

  */

 @Autowired

 public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

  KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();

  keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());

  auth.authenticationProvider(keycloakAuthenticationProvider);

 }



 /**

  * Defines the session authentication strategy.

  */

 @Bean

 @Override

 protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {

  return new NullAuthenticatedSessionStrategy();

 }



 @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;

 }


 @Bean

 @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)

 public AccessToken accessToken() {

  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())

   .getRequest();

  return ((KeycloakSecurityContext)((KeycloakAuthenticationToken) request.getUserPrincipal()).getCredentials())

   .getToken();

 }


 @Override

 protected void configure(HttpSecurity http) throws Exception {

  super.configure(http);

  http.authorizeRequests().antMatchers("/**").permitAll();

 }

}

Для защиты ресурса отдыха используется аннотация

@RolesAllowed(“Name of the role”)

Даже после назначения роли клиента пользователю было выдано сообщение об ошибке 403-Доступ запрещен

Я также пытался получить роли вручную, используя код

   SecurityContext securityContext = SecurityContextHolder.getContext();
   securityContext.getAuthentication().getAuthorities();

Но он всегда возвращал пустой массив.

1 Ответ

0 голосов
/ 12 января 2019

Мне удалось наконец решить проблему. Проблема была в отсутствующей конфигурации Scope в клиенте клиентского интерфейса. Для всех клиентов полный объем был отключен по соображениям безопасности. Из-за этого, если мы не установим явно в конфигурации клиентской области клиентского сайта включение ролей клиентского сервера, он не будет частью токена.

...