Безопасность / Аутентификация / Авторизация / Управление профилями
Общая информация
Система Universe предоставляет способы для внешней аутентификации пользователей, а также интеграции сторонних данных авторизации и использования внешних профилей.
- Для аутентификации используются внешние источники данных (LDAP, RADIUS, и т.д.) или из кастомных модулей 
- Возможно переопределить механизм авторизации/аутентификации целиком или частично. 
Особенности
- В системе сохраняется запись о пользователе с пометкой "внешний" и в дальнейшем используется в аудите или других сценариях. 
- Внешним пользователям можно назначать роли и добавлять их в группы пользователей. 
- Пароль внешнего пользователя не сохраняется в системе. 
- Внешний пользователь сможет авторизоваться только через тот источник данных, который зафиксирован в профиле пользователя. 
Переопределение авторизации
Для переопределения механизма авторизации необходимо реализовать интерфейс SecurityDataSource.
Интерфейсы из пакета org.unidata.mdm.core.type.security:
SecurityDataSource
AuthenticationProvider для поддержки внешней аутентификации
AuthorizationProvider для поддержки внешней авторизации
ProfileProvider для поддержки внешних профилей
InterceptionProvider
Пример реализации
В примере рассматривается SDKSecurityDataSource из модуля com.universe.mdm.sdk.spring.
Все строковые переменные хранятся в классе SDKSpringModuleConfigurationConstants в переменных конфигурации.
Задача: необходимо реализовать управление системой с использованием внешнего хранилища пользователей с доступом по REST api и раздачей прав доступа на ее основании.
- Реализуйте - 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);
        }
- Для переопределения поведения реализуйте методы: - 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;
    }
}