Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
hasPermission(Authentication, HttpServletRequest)
для контроля доступа на основе разрешений, используя интерфейс UriAuthoritiesPermissionEvaluator
. Условием использования этого интерфейса является то, что приложение использует RESTful API. Если же используется не RESTful API, следует использовать интерфейс hasPermission(Authentication, String, String)
для контроля доступа. Этот интерфейс реализуется с помощью аннотации @PerAuthorize("hasPermission('/users', 'list')")
, которая должна быть активирована с помощью аннотации @EnableGlobalMethodSecurity(prePostEnabled = true)
.UpdateCacheOfRolesResourcesService (https://gitee.com/pcore/UMS/blob/master/rbac/src/main/java/top/dcenter/ums/security/core/api/permission/service/UpdateCacheOfRolesResourcesService.java):
Используется для обновления и кэширования разрешений на основе ролей (роль/многопользовательская/SCOPE). При каждом обновлении роли URI (ресурса) необходимо вызывать этот интерфейс. Рекомендуется реализовать интерфейс RolePermissionsService, который автоматически публикует событие UpdateRolesResourcesEvent через AOP.
Рекомендации:
RolePermissionsService (https://gitee.com/pcore/UMS/blob/master/rbac/src/main/java/top/dcenter/ums/security/core/api/permission/service/RolePermissionsService.java):
// 1. Рекомендуемый способ использования событий (асинхронное выполнение)
applicationContext.publishEvent(new UpdateRolesResourcesEvent(true, UpdateRoleResourcesDto);
// 2. Прямой вызов службы
// Ролевые разрешения ресурсов
UpdateCacheOfRolesResourcesService.updateAuthoritiesByRoleId(roleId, resourceClass, resourceIds);
// Многопользовательские ролевые разрешения ресурсов
UpdateCacheOfRolesResourcesService.updateAuthoritiesByRoleIdOfTenant(tenantId, roleId, resourceClass, resourceIds);
// Разрешения ресурсов на основе SCOPE
UpdateCacheOfRolesResourcesService.updateAuthoritiesByScopeId(scopeId, roleId, resourceClass, resourceIds);
// Групповые разрешения ролей
UpdateCacheOfRolesResourcesService.updateRolesByGroupId(groupId, roleIds);
// Многопользовательские групповые разрешения ролей
UpdateCacheOfRolesResourcesService.updateRolesByGroupIdOfTenant(tenantId, groupId, roleIds);
3. Реализуйте этот интерфейс RolePermissionsService и не выполняйте вышеуказанные операции, поскольку он уже реализован через аспект RolePermissionsServiceAspect.
4. Обратите внимание, что аспект RolePermissionsServiceAspect вступает в силу только тогда, когда значение Order транзакции больше 1. Если это стандартная транзакция (приоритет равен Integer.MAX_VALUE), то не нужно беспокоиться об этом значении. Однако если это пользовательская транзакция и установлено значение Order, то оно должно быть больше 1.
Временная диаграмма авторизации:
Диаграмма времени обновления разрешений и обновления кэша разрешений в реальном времени:

Проверка подлинности:
— SMS-код: по умолчанию не реализован. — SmsCodeSender (https://gitee.com/pcore/UMS/blob/master/vc/src/main/java/top/dcenter/ums/security/core/api/validate/code/sms/SmsCodeSender.java)
— Изображение кода: реализована функция кэширования, поддерживается функция периодического обновления кэша, можно настроить путь вывода и количество кэшированных изображений кода. — ImageCodeFactory (https://gitee.com/pcore/UMS/blob/master/vc/src/main/java/top/dcenter/ums/security/core/api/validate/code/image/ImageCodeFactory.java)
— Код слайдера: реализована функция кэширования, поддерживается функция периодического обновления кэша, можно настроить путь вывода и количество кэшированных изображений кода, а также можно настроить исходный путь изображения и путь шаблона изображения (исходный путь изображения и путь шаблона изображения см. в примере проверки кода validate-code-example). — SimpleSliderCodeFactory (https://gitee.com/pcore/UMS/blob/master/vc/src/main/java/top/dcenter/ums/security/core/api/validate/code/slider/SliderCodeFactory.java)
— Пользовательский код: BaseAuthenticationSuccessHandler: обработчик успешной аутентификации.
BaseAuthenticationFailureHandler: обработчик неудачной аутентификации.
TenantContextHolder: многопользовательский контекстный менеджер. После реализации этого интерфейса и внедрения в IOC-контейнер, компоненты регистрации/логина/авторизации UMS по умолчанию будут автоматически внедрены. Необходимо реализовать этот интерфейс и внедрить его в IOC-контейнер для обеспечения многопользовательской функциональности UMS.
Функции:
tenantIdHandle(HttpServletRequest, String) извлекает tenantId из регистрационного пользовательского входа или входа в систему и выполняет необходимую логику (например, сохраняет tenantId в ThreadLocal, сеансе или кэше Redis).
getTenantId() упрощает последующую обработку данных регистрации, входа и авторизации пользователей (например, добавление условия tenantId в SQL, добавление разрешения TENANT_tenantId при регистрации пользователя, получение разрешений ролей на основе tenantId).
getTenantId(Authentication) — метод по умолчанию. Получает идентификатор арендатора от текущего пользователя после входа в систему, анализируя полномочия.
Примечание:
В многопользовательской системе интерфейсы, требующие использования tenantId без входа в систему (например, UserCache.getUserFromCache(String)/UmsUserDetailsService), могут использовать getTenantId(). Пользователи, которые уже вошли в систему, могут получить tenantId через Authentication.
Логика регистрации и входа по умолчанию в UMS включает tenantIdHandle(HttpServletRequest, String). Если вам нужно использовать tenantId при реализации интерфейсов, таких как UserCache/UmsUserDetailsService, вы можете вызвать метод getTenantId().
Если у вас есть собственная логика регистрации или входа, сначала вызовите tenantIdHandle(HttpServletRequest, String), а затем вызовите getTenantId(), когда вам понадобится tenantId при реализации таких интерфейсов, как UserCache/UmsUserDetailsService.
JWT-интерфейс: см. jwt-example.
Однократный вход (оператор):
Функция | Модуль | Пример модуля demo — простая конфигурация | Пример модуля demo — подробная конфигурация |
---|---|---|---|
1. Основные функции | core | basic-example | — |
2. Функция маршрутизации входа | core | — | basic-detail-example |
3. Сеанс | core | — | session-detail-example |
4. Запомнить меня | core | — | — |
通过下面的接口即可: HttpSecurityAware
:
top.dcenter.security.core.api.config.HttpSecurityAware
.@Configuration
public class WebSecurityAutoConfigurer extends WebSecurityConfigurerAdapter { }
@Configuration
public class WebSecurityAutoConfigurer {
@Bean
public SecurityCoreAutoConfigurer securityCoreAutoConfigurer() {
return new SecurityCoreAutoConfigurer();
}
}
Перевод текста на русский язык:
Через следующий интерфейс можно: HttpSecurityAware
— существующая конфигурация HttpSecurity, позволяет существующей конфигурации HttpSecurity реализовать этот интерфейс: top.dcenter.security.core.api.config.HttpSecurityAware
.
spring.factories
для загрузки данного класса возникает следующая ошибка: «Найден WebSecurityConfigurerAdapter и SecurityFilterChain. Пожалуйста, выберите только один».
Решение:spring.factories
, чтобы загрузить класс, затем добавьте пустой класс конфигурации WebSecurityConfigurerAdapter
, чтобы предотвратить автоматическую загрузку конфигурации WebSecurityConfigurerAdapter
по умолчанию Spring. Подходит для модулей, в которых были введены 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();
}
}
``` ## 12. Основываясь на механизме SLF4J MDC, функция отслеживания журнала
- Чтобы использовать эту функцию, добавьте `%X{MDC_TRACE_ID}` в шаблон `pattern` в файле конфигурации журнала.
```xml
<!-- Консоль -->
<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 родительского потока в дочерний поток
MDC.setContextMap(context);
r.run();
}, "testMDC").start();
-Spring security JustAuth starter для реализации сторонней аутентификации
-Быстрый стартер для интеграции нескольких storage клиентов на основе aws s3
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )