Безопасность / Аутентификация / Авторизация / Управление профилями

Общая информация

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

  • Для аутентификации используются внешние источники данных (LDAP, RADIUS, etc.) или из кастомных модулей

  • Возможно переопределить механизм авторизации/аутентификации целиком или частично.

Особенности

  • В системе сохраняется запись о пользователе с пометкой "внешний" и в дальнейшем используется в аудите или других сценариях.

  • Внешним пользователям можно назначать роли и добавлять их в группы пользователей.

  • Пароль внешнего пользователя не сохраняется в системе.

  • Внешний пользователь сможет авторизоваться только через тот источник данных, который зафиксирован в профиле пользователя.

Переопределение авторизации

Для переопределения механизма авторизации необходимо реализовать интерфейс SecurityDataSource.

Интерфейсы из пакета org.unidata.mdm.core.type.security:

  • SecurityDataSource

  • AuthenticationProvider для поддержки внешней аутентификации

  • AuthorizationProvider для поддержки внешней авторизации

  • ProfileProvider для поддержки внешних профилей

  • InterceptionProvider

Пример реализации

В примере рассматривается SDKSecurityDataSource из модуля com.universe.mdm.sdk.spring.

Все строковые переменные хранятся в классе SDKSpringModuleConfigurationConstants в переменных конфигурации.

Задача: необходимо реализовать управление системой с использованием внешнего хранилища пользователей с доступом по REST api и раздачей прав доступа на ее основании.

  1. Реализуйте SecurityDataSource и зарегистрируйте его в системе:

@Service
public class SDKSecurityDataSource implements SecurityDataSource, AfterModuleStartup {

    @Autowired
    private SecurityService securityService;

    @Override
    public void afterModuleStartup() {
        securityService.register(this);
    }

}
  • SecurityDataSource требует реализации обязательных методов для описания источника:

package com.universe.mdm.sdk.spring.configuration;

public class SDKSpringModuleConfigurationConstants {

    // ...

    public static final String SDK_SECURITY_DATA_SOURCE_NAME = "sdk_security_source";

    // Не забудьте добавить тексты в sdk_spring_messages_{en|ru}.properties
    public static final String SDK_SECURITY_DATA_SOURCE_DESCRIPTION = SDKSpringModule.MODULE_ID + ".security.data.source.description";

    // ...

}

package com.universe.mdm.sdk.spring.service.security;

@Service
public class SDKSecurityDataSource implements SecurityDataSource, AfterModuleStartup {

        // Использование textService необходимо для локализации
        @Autowired
        private TextService textService;

        @Override
        public String getName() {
            return SDK_SECURITY_DATA_SOURCE_NAME;
        }

        @Override
        public String getDescription() {
            return textService.getText(SDK_SECURITY_DATA_SOURCE_DESCRIPTION);
        }
  1. Для переопределения поведения реализуйте методы:

    • public InterceptionProvider getInterceptionProvider()

    • public AuthenticationProvider getAuthenticationProvider()

    • public AuthorizationProvider getAuthorizationProvider()

    • public ProfileProvider getProfileProvider()

  • Можно использовать системную реализацию или вернуть null:

package com.universe.mdm.sdk.spring.service.security;

@Service
public class SDKSecurityDataSource implements SecurityDataSource, AfterModuleStartup {

    @Autowired
    private SystemSecurityDataSourceComponent systemSecurityDataSourceComponent;

    @Override
    public InterceptionProvider getInterceptionProvider() {
        return systemSecurityDataSourceComponent.getInterceptionProvider();
    }

    @Override
    public AuthenticationProvider getAuthenticationProvider() {
        return null;
    }

Пример реализации SDKSecurityDataSource:

@Service
public class SDKSecurityDataSource implements SecurityDataSource, AfterModuleStartup {

    @Autowired
    private SecurityService securityService;

    @Autowired
    private TextService textService;

    @Autowired
    private SDKProfileProvider sdkProfileProvider;

    @Autowired
    private SDKAuthenticationProvider authenticationProvider;

    @Autowired
    private SDKAuthorizationProvider authorizationProvider;

    @Autowired
    private SystemSecurityDataSourceComponent systemSecurityDataSourceComponent;

    @Override
    public void afterModuleStartup() {
        securityService.register(this);
    }

    @Override
    public String getName() {
        return SDK_SECURITY_DATA_SOURCE_NAME;
    }

    @Override
    public String getDescription() {
        return textService.getText(SDK_SECURITY_DATA_SOURCE_DESCRIPTION);
    }


    @Override
    public InterceptionProvider getInterceptionProvider() {
        return systemSecurityDataSourceComponent.getInterceptionProvider();
    }

    @Override
    public AuthenticationProvider getAuthenticationProvider() {
        return authenticationProvider;
    }

    @Override
    public AuthorizationProvider getAuthorizationProvider() {
        return authorizationProvider;
    }

    @Override
    public ProfileProvider getProfileProvider() {
        return sdkProfileProvider;
    }
}