Управление пользователями UMS: каркас для разработки
Каркас для управления пользователями
UMS — это ненавязчивый каркас для управления пользователями с высокой степенью развязки от бизнес-логики, который можно настраивать.
Каркас для управления пользователями, интеграция: вход по паролю пользователя, мобильный вход, вход OAuth2 (на основе JustAuth), однократный вход, поддержка мультиарендности, JWT, проверка кода (изображение, SMS, ползунок), RBAC, SLF4J-MDC, подпись и т. д.
Модуль | Функция |
---|---|
commons | Общий компонентный модуль |
ums | Интегрированный модуль commons/core/vc/mdc/oauth/rbac/jwt |
core | Вход по имени пользователя и паролю/Мобильный вход и автоматическая регистрация/Подпись/Упрощение конфигурации сеанса, запоминание меня, csrf cors и т.д./Сеанс redis cache/Возврат данных JSON или HTML в зависимости от установленного метода ответа (JSON и REDIRECT)/JWT/Модель mdc |
vc | Проверка кода (изображения, SMS, слайдер) 1. Сервис пользователя: Must implemente . |
Контроль доступа на основе RBAC: поддержка мультиарендности.
UriAuthorizeService: Рекомендуется реализовать интерфейс AbstractUriAuthorizeService для реализации этого интерфейса
.
AbstractUriAuthorizeService: Должен быть реализован (Must implemente)
.
uri (ресурс) сервис контроля доступа к правам на основе (роль / мультиарендность / SCOPE), определяющий логику контроля доступа на основе ролей / мультиарендности / SCOPE. Реализуйте абстрактный класс AbstractUriAuthorizeService и внедрите его в IOC-контейнер, чтобы заменить DefaultUriAuthorizeService.
Обратите внимание:
1. Рекомендуется реализовать AbstractUriAuthorizeService одновременно с реализацией UpdateCacheOfRolesResourcesService для обновления и кэширования сервиса разрешений, что может помочь повысить производительность службы авторизации.
2. Требования к входящим полномочиям Authentication являются жёсткими:
// Эти полномочия могут включать: [ROLE_A, ROLE_B, ROLE_xxx TENANT_110110, SCOPE_read, SCOPE_write, SCOPE_xxx]
// Требования к полномочиям:
// 1. Количество ролей >= 0
// 2. Количество SCOPE >= 0
// 3. Количество мультитенантов 1 или 0
// 4. Количество ролей + количество SCOPE >= 1
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
3. Этот фреймворк по умолчанию реализует метод hasPermission(Authentication, HttpServletRequest) для контроля доступа, используя интерфейс UriAuthoritiesPermissionEvaluator. Использование этого интерфейса требует, чтобы приложение использовало restful API; если это не так, используйте интерфейс hasPermission(Authentication, String, String) для контроля доступа. Этот интерфейс использует аннотацию @PerAuthorize("hasPermission('/users', 'list')") для реализации, и необходимо включить аннотацию @EnableGlobalMethodSecurity(prePostEnabled = true).
UpdateCacheOfRolesResourcesService:
Используется для обновления и кеширования сервисов разрешений на основе (роли / мультиаренды / SCOPE). Необходимо вызывать этот интерфейс каждый раз, когда обновляется разрешение роли для uri (ресурса). Рекомендуется реализовать интерфейс RolePermissionsService, который автоматически публикует событие UpdateRolesResourcesEvent через AOP, вызывая соответствующий метод UpdateCacheOfRolesResourcesService.
Рекомендации:
1. На основе контроля разрешений ролей: реализуйте обновление и кеширование разрешений всех ролей для всех uri (ресурсов) в локальной памяти.
2. На основе контроля разрешений SCOPE: ситуация немного сложнее, но типов разрешений SCOPE относительно мало, и их также можно реализовать аналогично 1 для кеширования и обновления в локальной памяти.
3. На основе контроля разрешений мультиарендности: ситуация более сложная, и если мультиарендных арендаторов мало, то все разрешения также могут быть полностью кэшированы в локальной памяти. В большинстве случаев полное кеширование в локальной памяти невозможно, и можно использовать только такие механизмы кеширования, как redis.
Обновляет и запрашивает сервисы разрешений на основе (ролей / мультиаренд / SCOPE). В основном используется для добавления операций с разрешениями ролей.
Примечание:
1. При добавлении ресурсов используйте PermissionType.getPermission() для стандартизации формата разрешений, поскольку необходимо поддерживать restful API, а при авторизации необходимо сопоставить HttpMethod с соответствующим разрешением.
2. Если вы реализуете интерфейс UpdateCacheOfRolesResourcesService, но не реализуете RolePermissionsService, при изменении или добавлении разрешений ресурсов на основе «ролей / мультиаренд / SCOPE» обязательно вызовите соответствующий метод UpdateCacheOfRolesResourcesService. Есть два способа: один — опубликовать событие, другой — напрямую вызвать соответствующий сервис. UpdateCacheOfRolesResourcesService.updateRolesByGroupIdOfTenant(tenantId, groupId, roleIds)
Реализовать интерфейс RolePermissionsService, не требуется выполнять операции двух предыдущих методов. Публикация события UpdateRolesResourcesEvent реализована через AOP.
Внимание: условие для того, чтобы аспект RolePermissionsServiceAspect вступил в силу — значение Order в транзакции должно быть больше 1. Если это стандартная транзакция (приоритет равен Integer.MAX_VALUE), то беспокоиться об этом значении не нужно. Если же это пользовательская транзакция и задано значение Order, то оно должно быть больше 1.
Проверка кода (ValidateCode)
— SMS-код проверки: реализация по умолчанию отсутствует. — SmsCodeSender.
— Изображение кода проверки: реализована функция кэширования, поддерживается функция периодического обновления кэша, можно настроить путь вывода и количество изображений кэша. — ImageCodeFactory.
— Код проверки с ползунком: реализована функция кэширования, поддерживается функция периодического обновления кэша, можно настроить пути вывода и количества изображений кэша; поддерживается настройка исходного изображения и пути шаблона изображения (исходное изображение и шаблон изображения см. в validate-code-example). — SimpleSliderCodeFactory.
— Пользовательский код проверки: — AbstractValidateCodeProcessor. — ValidateCodeGenerator.
OAuth2
— Настроить кодирование и декодирование состояния в процессе OAuth2. Можно передавать необходимую информацию, например, адрес перехода после успешного входа в систему от стороннего поставщика услуг. — Auth2StateCoder: необходимо реализовать пользователю. Кодирует и декодирует состояние в процессе авторизации от стороннего провайдера. Можно передать необходимую информацию, такую как адрес перехода после успешной авторизации от стороннего провайдера услуг. Обратите внимание, что оба метода этого интерфейса должны реализовывать соответствующую логику кодирования и декодирования. После реализации интерфейса его необходимо внедрить в IOC-контейнер. Если есть необходимость получить параметр authorizeUrl от внешнего интерфейса, а затем передать дополнительную информацию на сервер во время регистрации, необходимо реализовать этот интерфейс вместе с методом UmsUserDetailsService.registerUser(AuthUser, String, String, String).
— Получить информацию о пользователе от стороннего поставщика услуг: — Auth2UserService: обычно не требует реализации пользователем, если только не требуется настроить получение информации о пользователе. Внедрить в IOC-контейнер после реализации.
— Регистрация, привязка и обновление информации о пользователях от сторонних поставщиков услуг и информации о токенах доступа: — ConnectionService: регистрация, привязка, обновление информации о сторонних пользователях и токенов доступа. Обычно не требует реализации, за исключением случаев, когда требуется настроить процесс получения информации о пользователях. Внедрить в IOC-контейнер после реализации. Необходимо отключить автоматическое создание таблиц auth_token и user_connection при запуске приложения, установив свойство ums.repository.enableStartUpInitializeTable = false.
— UsersConnectionRepository: интерфейс для добавления, удаления, изменения и запроса информации о пользователях сторонних провайдеров, привязки и отвязки, а также проверки привязки и отвязки. Обычно не требует реализации. Внедрить в IOC-контейнер после реализации, если требуется настроить получение информации о пользователях.
— UsersConnectionTokenRepository: интерфейс для запроса, добавления, удаления и изменения информации о токене доступа. Обычно не требует реализации. Внедрить в IOC-контейнер после реализации, если требуется настроить получение информации о пользователях. | **Модуль (model)** | **demo модуль — простая конфигурация (Simple Configuration)** | **demo модуль — подробная конфигурация (detail Configuration)** |
| ------------------------------------------------------------ | -------------------------------------------------------- | ------------------------------------------------------------| | 1. Основные функции | core | basic-example | | 2. Функции маршрутизации входа | core | | basic-detail-example| | 3. Session | core | | session-detail-example| | 4. Remember-me | core | | basic-detail-example| | 5. CSRF | core | | basic-detail-example| | 6. Anonymous | core | | basic-detail-example| | 7. Проверка кода | core | | validate-code-example| | 8. Вход с мобильного устройства | core | | basic-detail-example| | 9. Сторонний вход | core | | basic-detail-example| | 10. Добавление таблиц user_connection и auth_token в базу данных redis для использования при стороннем входе | | | Внимание: данный ответ не является профессиональным переводом, так как в запросе отсутствует текст.
Семь. Примечание (NOTE):
Проблемы конфигурации HttpSecurity: проблема конфликта конфигурации HttpSecurityAware в UMS и конфигурации HttpSecurity в приложении:
HttpSecurityAware
.top.dcenter.security.core.api.config.HttpSecurityAware
.В сочетании с spring cloud: 2020.0.0 и spring 2.4.x при изменении способа загрузки файлов конфигурации, при использовании spring.factories для загрузки этого класса будет отображаться следующее сообщение об ошибке: Found WebSecurityConfigurerAdapter as well as SecurityFilterChain. Please select just one.
// Первый вариант: используйте spring.factories для загрузки этого класса, затем добавьте пустой класс конфигурации WebSecurityConfigurerAdapter ниже, чтобы предотвратить автоматическую загрузку Spring по умолчанию конфигурации WebSecurityConfigurerAdapter.
// Подходит для модулей, которые импортировали top.dcenter:ums-core-spring-boot-starter или top.dcenter:ums-spring-boot-starter.
@Configuration
public class WebSecurityAutoConfigurer extends WebSecurityConfigurerAdapter { }
// Второй вариант: не используйте spring.factories для загрузки этого класса, а напрямую зарегистрируйте этот класс в контейнере IOC.
// Подходит для всех модулей.
@Configuration
public class WebSecurityAutoConfigurer {
@Bean
public SecurityCoreAutoConfigurer securityCoreAutoConfigurer() {
return new SecurityCoreAutoConfigurer();
}
}
Схема логической последовательности конфигурации безопасности:
// Пример
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
// Auth2Jackson2Module — это конфигурация десериализации, реализованная в этом проекте
objectMapper.registerModules(new CoreJackson2Module(), new WebJackson2Module(), new Auth2Jackson2Module());
jackson2JsonRedisSerializer.setObjectMapper(om);
Диаграмма последовательности |
---|
CSRF |
Получение кода подтверждения |
Логика изображения кода подтверждения |
Выход из системы |
%X{MDC_TRACE_ID}
в шаблон конфигурации журнала.<!-- Консоль -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- Формат журнала -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- [%thread] %X{MDC_TRACE_ID} %logger[%L] - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- Этот appender журнала предназначен для разработки и только настраивает самый низкий уровень, журналы с уровнем выше или равным этому уровню будут выводиться на консоль -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- Только этот журнал может быть просмотрен, SQL-запрос -->
<level>DEBUG</level>
</filter>
</appender>
# Тип идентификатора отслеживания журнала на основе SLF4J MDC, по умолчанию это uuid. Если необходимо настроить идентификатор, type = MdcIdType.CUSTOMIZE_ID, затем реализуйте метод MdcIdGenerator.getMdcId() и внедрите его в контейнер IOC.
ums:
mdc:
type: UUID/THREAD_ID/SESSION_ID/CUSTOMIZE_ID
Если ums.mdc.type = CUSTOMIZE_ID, необходимо реализовать интерфейс MdcIdGeneratorMdcIdGenerator и внедрить его в контейнер IOC.
MDC.getCopyOfContextMap()
для получения контекста MDC. Дочерний поток должен сначала вызвать MDC.setContextMap(context)
перед выполнением операции, чтобы установить контекст родительского потока в дочернем потоке. Конфигурацию ThreadPoolTaskExecutor см. в ScheduleAutoConfiguration.final Logger log = LoggerFactory.getLogger(this.getClass());
// Получение содержимого MDC родительского потока
final Map<String, String> context = MDC.getCopyOfContextMap();
final Runnable r = () -> {
log.info("testMDC");
System.out.println("...");
};
new Thread(() -> {
// Установка контекста родительского потока в дочерний поток
MDC.setContextMap(context);
r.run();
}, "testMDC").start();
Шаблон проекта Spring security для интеграции JustAuth для реализации авторизации от третьих лиц
Стартер для быстрой интеграции нескольких storage client на основе aws s3
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )