Безопасность / Аутентификация / Авторизация / Управление профилями¶
Общая информация¶
Система 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 и раздачей прав доступа на ее основании.
Реализуйте
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;
}
}