Spring security интегрирует JustAuth для обеспечения сторонней аутентификации: этот проект был выделен из проекта каркаса управления пользователями (UMS): https://github.com/ZeroOrInfinity/UMS | https://gitee .com/pcore/UMS).
<dependency>
<groupId>top.dcenter</groupId>
<artifactId>justAuth-spring-security-starter</artifactId>
<version>latest</version>
</dependency>
<dependency>
<groupId>top.dcenter</groupId>
<artifactId>justAuth-spring-security-starter</artifactId>
<version>latest</version>
</dependency>
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private Auth2AutoConfigurer auth2AutoConfigurer;
@Autowired
private Auth2Properties auth2Properties;
@Override
protected void configure(HttpSecurity http) throws Exception {
// ========= start: использование justAuth-spring-security-стартера обязательно =========
// Добавление Auth2AutoConfigurer для включения OAuth2 (justAuth) login.
http.apply(this.auth2AutoConfigurer);
http.csrf().disable();
// Разрешение доступа к точкам входа и обратного вызова для сторонних методов входа
// @formatter:off
http.authorizeRequests()
.antMatchers(HttpMethod.GET,
auth2Properties.getRedirectUrlPrefix() + "/*",
auth2Properties.getAuthLoginUrlPrefix() + "/*")
.permitAll();
// @formatter:on
// ========= end: использование justAuth-spring-security-стартера обязательно =========
}
}
UmsUserDetailsService: необходимо реализовать
Auth2StateCoder: пользователь должен реализовать, если необходимо настроить кодирование и декодирование состояния в процессе стороннего входа. Можно передать необходимую информацию, например, целевой URL после успешного входа третьей стороны. Обратите внимание, что два метода этого интерфейса должны быть реализованы одновременно. После реализации интерфейса его можно внедрить в контейнер IOC. Если есть интерфейс переднего плана для получения authorizeUrl, который передаёт дополнительные параметры на задний план, и используется для регистрации, он должен быть реализован вместе с методом UmsUserDetailsService.registerUser(AuthUser, String, String, String).
Auth2UserService: интерфейс для получения информации о пользователе третьей стороны. Обычно не требует реализации пользователем, за исключением случаев, когда требуется настроить получение информации о пользователе третьей стороны. Реализуйте этот интерфейс и внедрите его в контейнер IOC, чтобы заменить его. ConnectionService (https://gitee.com/pcore/just-auth-spring-security-starter/blob/master/src/main/java/top/dcenter/ums/security/core/oauth/signup/ConnectionService.java):
Интерфейс для регистрации, привязки, обновления информации о пользователях и accessToken третьих сторон при авторизации. Обычно не требует реализации со стороны пользователя.
Исключение составляют случаи, когда необходимо настроить логику получения информации о пользователе третьей стороны. В таких случаях достаточно реализовать интерфейс и внедрить его в IOC контейнер.
UsersConnectionRepository (https://gitee.com/pcore/just-auth-spring-security-starter/blob/master/src/main/java/top/dcenter/ums/security/core/oauth/repository/UsersConnectionRepository.java):
Интерфейс для операций добавления, изменения и удаления информации о пользователях третьих сторон, а также для привязки и отвязки пользователей. Обычно не требует реализации со стороны пользователя.
Исключения составляют случаи, когда необходима настройка логики получения информации о пользователе третьей стороны. Тогда достаточно реализовать интерфейс и внедрить его в IOC контейнер.
UsersConnectionTokenRepository (https://gitee.com/pcore/just-auth-spring-security-starter/blob/master/src/main/java/top/dcenter/ums/security/core/oauth/repository/UsersConnectionTokenRepository.java):
Интерфейс для работы с информацией о токенах доступа пользователей третьих сторон. Обычно не требует реализации со стороны пользователя.
Исключением являются случаи, когда требуется настроить логику получения информации о пользователе третьей стороны. Для этого достаточно реализовать интерфейс и внедрить его в IOC контейнер.
Для отмены встроенной базы данных необходимо выполнить следующие шаги:
Отключить поддержку встроенных таблиц user_connection и auth_token, установив значение свойства enable-user-connection-and-auth-token-table равным false.
Если поддержка таблицы auth_token отключена, необходимо реализовать интерфейс ConnectionService.
В системе предусмотрены два пользовательских провайдера: ums.oauth.customize и ums.oauth.gitlabPrivate.
AuthGitlabPrivateSource (https://gitee.com/pcore/just-auth-spring-security-starter/blob/master/src/main/java/top/dcenter/ums/security/core/oauth/justauth/source/AuthGitlabPrivateSource.java) — абстрактный класс. При реализации и внедрении в IOC-контейнер необходимо также реализовать AuthCustomizeRequest. После этого AuthGitlabPrivateSource будет автоматически интегрирован в процесс аутентификации OAuth2 Login. Достаточно настроить соответствующие свойства (ums.oauth.gitlabPrivate.[clientId|clientSecret] и др.).
AuthCustomizeSource (https://gitee.com/pcore/just-auth-spring-security-starter/blob/master/src/main/java/top/dcenter/ums/security/core/oauth/justauth/source/AuthCustomizeSource.java) — ещё один абстрактный класс, который работает аналогично AuthGitlabPrivateSource.
AuthCustomizeRequest (https://gitee.com/pcore/just-auth-spring-security-starter/blob/master/src/main/java/top/dcenter/ums/security/core/oauth/justauth/request/AuthCustomizeRequest.java) — также абстрактный класс. Его реализация и внедрение в IOC-контейнер требуют одновременной реализации AuthCustomizeSource или AuthGitlabPrivateSource. После внедрения AuthCustomizeRequest будет автоматически включён в процесс аутентификации OAuth2 Login. Настройка соответствующих свойств (ums.oauth.customize.[clientId|clientSecret]) аналогична настройке для AuthGitlabPrivateSource.
При активации функции однократного входа необходимо реализовать этот интерфейс. Он позволяет получить номер телефона пользователя на основе токена доступа от поставщика услуг.
Чтобы решить проблему с невозможностью десериализации некоторых типов данных из Redis, добавлены некоторые десериализаторы для Authentication и UserDetails.
Конкретные настройки десериализатора Redis можно найти в методе RedisCacheAutoConfiguration.getJackson2JsonRedisSerializer().
Обратите внимание, что класс UmsUserDetailsService уже имеет реализацию десериализатора для своего метода регистрации пользователей. Однако если вы создаёте собственный подкласс, вам придётся самостоятельно реализовать десериализатор.
Необходимо добавить зависимости в проект. Класс UserDetailsServiceImpl реализует сервис UmsUserDetailsService:
@author YongWu zheng @version V1.0 Created by 2020/9/20 11:06
import org.springframework.security.crypto.password.PasswordEncoder;
import top.dcenter.ums.security.core.oauth.enums.ErrorCodeEnum;
import top.dcenter.ums.security.core.oauth.exception.RegisterUserFailureException;
import top.dcenter.ums.security.core.oauth.exception.UserNotExistException;
import top.dcenter.ums.security.core.oauth.service.UmsUserDetailsService;
import java.util.List;
/**
* Сервис регистрации и авторизации пользователей с помощью пароля и SMS:
* 1. Для сторонних логинов и парольных логинов.
* 2. Для парольного входа.
* 3. Регистрация пользователей.
*/
@Service
public class UserDetailsServiceImpl implements UmsUserDetailsService {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Autowired(required = false)
private UserCache userCache;
/**
* Для шифрования и дешифрования паролей.
*/
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
try {
// Извлекаем информацию о пользователе из кэша:
if (this.userCache != null) {
UserDetails userDetails = this.userCache.getUserFromCache(username);
if (userDetails != null) {
return userDetails;
}
}
// Получаем информацию о пользователе:
// Логика получения информации о пользователе...
// ...
log.info("Demo ======>: Логин пользователя: {}, успешная авторизация", username);
return new User(username,
passwordEncoder.encode("admin"),
true,
true,
true,
true,
AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_VISIT, ROLE_USER"));
} catch (Exception e) {
String msg = String.format("Demo ======>: Логин пользователя: %s, ошибка авторизации: %s", username, e.getMessage());
log.error(msg);
throw new UserNotExistException(ErrorCodeEnum.QUERY_USER_INFO_ERROR, e, username);
}
}
@Override
public UserDetails registerUser(AuthUser authUser, String username, String defaultAuthority, String decodeState) throws RegisterUserFailureException {
// Для сторонних логинов пароль не требуется, здесь он устанавливается произвольно для генерации среды в соответствии с собственной логикой.
String encodedPassword = passwordEncoder.encode(authUser.getUuid());
final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
requestAttributes.setAttribute("redirectUrl", decodeState, RequestAttributes.SCOPE_REQUEST);
List<GrantedAuthority> grantedAuthorities = AuthorityUtils.commaSeparatedStringToAuthorityList(defaultAuthority);
log.info("Demo ======>: Имя пользователя: {}, регистрация прошла успешно", username);
UserDetails user = User.builder()
.username(username)
.password(encodedPassword)
.disabled(false)
.accountExpired(false)
.accountLocked(false)
.credentialsExpired(false)
.authorities(grantedAuthorities)
.build();
if (userCache != null) {
}}
``` ### 4. Страницы фронтенда:
#### login.html: разместить в classpath:/static
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Вход</title>
</head>
<body>
<h2>Страница входа</h2>
<h3>Социальный вход</h3>
<a href="/demo/auth2/authorization/gitee">Вход через gitee</a>
<a href="/demo/auth2/authorization/github">Вход через github</a>
<a href="/demo/auth2/authorization/qq">Вход через qq</a>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Индекс</title>
</head>
<body>
hello world!<br>
<form action="/demo/logout?logout" method="post">
<input type="submit" value="Выход post"/>
</form>
<br>
<br>
<a href="/demo/auth2/authorization/gitee">Войти через gitee</a>
<a href="/demo/auth2/authorization/github">Войти через github</a>
<a href="/demo/auth2/authorization/qq">Войти через qq</a>
</body>
</html>
http://localhost:9090/demo/login.html
. Это интегрирует сторонний вход (justAuth-spring-security-starter) и обеспечивает быструю разработку.Свойство | Тип | Значение по умолчанию | Описание | Опции |
---|---|---|---|---|
ums.oauth.autoSignUp | Boolean | true | Поддерживает ли автоматический вход после стороннего входа, если пользователь не зарегистрирован. По умолчанию: true | true/false |
ums.oauth.signUpUrl | String | /signUp.html | Если пользователь не зарегистрирован и не поддерживает автоматический вход, то перенаправляет на этот URL для регистрации. Этот URL должен быть реализован разработчиком; по умолчанию: /signUp.html ; например: 1. Установите значение "/signUp" , чтобы перейти к "/signUp" для регистрации. 2. Если вы хотите вернуть пользовательские данные JSON во внешний интерфейс, здесь необходимо установить null, а затем обработать возврат JSON в AuthenticationSuccessHandler на Auth2LoginAuthenticationFilter . Судить, является ли это временным пользователем, можно по Authentication.getPrincipal() , является ли он типом TemporaryUser . |
|
ums.oauth.temporaryUserPassword | String | "" | Используется при входе через сторонние сервисы, когда автоматический вход отключен и пользователь впервые входит в систему как временный пользователь. Пароль по умолчанию пуст. Обратите внимание: замените пароль в производственной среде. | |
ums.oauth.temporaryUserAuthorities | String | "ROLE_TEMPORARY_USER" | Используется при входе через сторонние сервисы, когда автоматический вход отключён и пользователь впервые вошёл в систему как временный пользователь, полномочия по умолчанию. Несколько полномочий разделяются запятыми. По умолчанию — "ROLE_TEMPORARY_USER". | |
ums.oauth.domain | String | http://127.0.0.1 | Домен обратного вызова стороннего входа. Например: https://localhost. По умолчанию «http://127.0.0.1». redirectUrl формируется напрямую из {domain}/{servletContextPath}/{redirectUrlPrefix}/{providerId}(ums.oauth.[qq/gitee/weibo]) . |
|
ums.oauth.redirectUrlPrefix | String | /oauth/login | Префикс URL обработки обратного вызова входа через сторонние сервисы. Не включает ServletContextPath , по умолчанию /oauth/login . |
|
ums.oauth.authLoginUrlPrefix | String | /oauth/authorization | Префикс URL авторизации входа через сторонние сервисы. Не включает ServletContextPath , по умолчанию /oauth/authorization . |
|
ums.oauth.temporaryUserAuthorities | String | ROLE_USER | Полномочия по умолчанию после успешного входа через сторонние сервисы. Несколько полномочий разделены запятыми, по умолчанию — «ROLE_USER». | |
ums.oauth.suppressReflectWarning | Boolean | false | Подавляет предупреждения о рефлексии. Поддерживает JDK11, по умолчанию false. После подтверждения WARNING: An illegal reflective access operation has occurred можно включить эту настройку, чтобы подавить предупреждения о рефлексии. | true/false |
ums.oauth.enableUserConnectionAndAuthTokenTable | Boolean | true | Поддержка встроенной таблицы пользователей (user_connection ) и токенов аутентификации для сторонних сервисов. |
|
------------------------------------------------------------- | ---------------------- | -------------------- | -------------------------------------------------------------------- | |
auth_token | true | Если false, необходимо реализовать интерфейс ConnectionService. | ||
ums.oauth.enableAuthTokenTable | Boolean | true | Поддержка встроенной таблицы сторонних токенов auth_token. | |
refreshToken периодическая задача | ||||
ums.oauth.refreshTokenJobCron | String | 0 * 2 * * ? | Выражение cron-типа. 0 * 2 * *? соответствует: second/minute/hour/day of month/month/day of week. | |
По умолчанию: «0 * 2 * *?», запуск задачи в 2 часа ночи, поддерживается распределённое выполнение (в IOC контейнере должен быть RedisConnectionFactory). | ||||
ums.oauth.enableRefreshTokenJob | Boolean | false | Поддержка периодического обновления AccessToken, так как многие приложения имеют собственные периодические задачи, по умолчанию false. Интерфейс RefreshTokenJob уже внедрён в IOC контейнер для удобства вызова при реализации пользовательских интерфейсов периодических задач. Поддерживается распределённое выполнение. | |
В IOC контейнере также должен быть RedisConnectionFactory. | ||||
ums.oauth.batchCount | Integer | 1000 | Количество записей базы данных, обрабатываемых при периодическом обновлении accessToken. При распределённом приложении эта конфигурация должна быть одинаковой на разных серверах. Размер batchCount следует оптимизировать в соответствии с реальной производственной средой. | |
ums.oauth.remainingExpireIn | Integer | 24 | Срок действия accessToken до его обновления. По умолчанию 24 часа. | |
justAuth | ||||
ums.oauth.justAuth.ignoreCheckState | Boolean | false | Игнорировать проверку состояния, по умолчанию не включено. Когда ignoreCheckState имеет значение true, me.zhyd.oauth.request.AuthDefaultRequest.login(AuthCallback) не будет проверять законность состояния. | |
Используется, когда реализована собственная логика проверки состояния. | ||||
ums.oauth.justAuth.timeout | Duration | PT180S | Время ожидания по умолчанию для кэша состояния: 3 минуты (PT180S). Учитывая время, затрачиваемое на процесс авторизации, которое может варьироваться в зависимости от индивидуальных привычек пользователя или платформы авторизации (например, Google), и то, что каждый процесс авторизации обычно не занимает слишком много времени, этот кэш по умолчанию настроен на истечение срока действия через 3 минуты. Программа предполагает, что авторизация действительна в течение 3 минут, а после истечения этого времени считается недействительной и удаляется. | |
ums.oauth.justAuth.cacheType | StateCacheType | SESSION | Тип кэширования состояния justAuth, по умолчанию session. | |
ums.oauth.justAuth.cacheKeyPrefix | String | JUST_AUTH: | Префикс ключа кэша justAuth state. | |
proxy | ||||
ums.oauth.proxy.enable | Boolean | false | Поддерживать ли прокси, по умолчанию false. Если false, другие атрибуты не действуют. | |
ums.oauth.proxy.proxy | Proxy.Type | HTTP | Для зарубежных сервисов можно отдельно настроить тип прокси, по умолчанию Proxy.Type.HTTP. | |
ums.oauth.proxy.hostname | String | Хост прокси, действует при enable = true. | ||
ums.oauth.proxy.port | Integer | Порт прокси, действует при enable = true. | ||
ums.oauth.proxy.timeout | Duration | PT3S | Тайм-аут прокси, по умолчанию PT3S. | |
ums.oauth.proxy.foreignTimeout | Duration | PT15S | Иностранный тайм-аут. | Используется для прокси-сервера зарубежных сайтов, по умолчанию PT15S |
github | ||||
ums.oauth.github.clientId | Строка | client Id |
||
ums.oauth.github.clientSecret | Строка | client Secret |
||
ums.oauth.github.scopes | Список<Строка> | Поддерживает настраиваемое содержимое области действия для платформ авторизации, формат см. в подклассах соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
ums.oauth.weibo.clientId | Строка | client Id |
||
ums.oauth.weibo.clientSecret | Строка | client Secret |
||
ums.oauth.weibo.scopes | Список<Строка> | Поддерживает настраиваемое содержимое области действия для платформ авторизации, формат см. в подклассах соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
gitee | ||||
ums.oauth.gitee.clientId | Строка | client Id |
||
ums.oauth.gitee.clientSecret | Строка | client Secret |
||
ums.oauth.gitee.scopes | Список<Строка> | Поддерживает настраиваемое содержимое области действия для платформ авторизации, формат см. в подклассах соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
dingtalk | ||||
ums.oauth.dingtalk.clientId | Строка | client Id |
||
ums.oauth.dingtalk.clientSecret | Строка | client Secret |
||
baidu | ||||
ums.oauth.baidu.clientId | Строка | client Id |
||
ums.oauth.baidu.clientSecret | Строка | client Secret |
||
ums.oauth.baidu.scopes | Список<Строка> | Поддерживает настраиваемое содержимое области действия для платформ авторизации, формат см. в подклассах соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
coding | ||||
------------------------------------------------------------------------ | ||||
ums.oauth.coding.clientId | Строка | client Id |
||
ums.oauth.coding.clientSecret | Строка | client Secret |
||
ums.oauth.coding.codingGroupName | Строка | Использование Coding для входа требует передачи этого значения. Префикс домена команды, например, «https://justauth.coding.net/»: codingGroupName = justauth |
||
ums.oauth.coding.scopes | List<Строка> | Поддерживает настраиваемое содержимое области действия для платформы авторизации, формат см. в соответствующем подклассе AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области по умолчанию. | ||
oschina | ||||
ums.oauth.oschina.clientId | Строка | client Id |
||
ums.oauth.oschina.clientSecret | Строка | client Secret |
||
alipay | ||||
ums.oauth.alipay.clientId | Строка | client Id |
||
ums.oauth.alipay.clientSecret | Строка | client Secret |
||
ums.oauth.alipay.alipayPublicKey | Строка | Открытый ключ Alipay: когда выбран вход через Alipay, это значение можно использовать с «открытым ключом RSA2 (SHA256)» в значении «открытый ключ Alipay». | ||
ums.oauth.alipay.proxyHost | Строка | Alipay: у Alipay есть собственный прокси-сервер, по умолчанию прокси-сервер не действует для Alipay, хост прокси: | ||
ums.oauth.alipay.proxyPort | Целое число | Alipay: у Alipay есть собственный прокси-сервер, по умолчанию прокси-сервер не действует для Alipay, порт прокси: | ||
ums.oauth.qq.clientId | Строка | client Id |
||
ums.oauth.qq.clientSecret | Строка | client Secret |
||
ums.oauth.qq.unionId | Строка | Требуется ли заявка на unionId, по умолчанию: false. В настоящее время применяется только к qq login. Примечание: при авторизации qq получение unionId требует отдельной отправки запроса на разрешение. Если личный аккаунт разработчика имеет эту привилегию, можно установить значение true, и при получении openId будет синхронизироваться получение unionId. Ссылка для справки: http://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D | ||
ums.oauth.qq.scopes | List<Строка> | Поддержка настраиваемого содержимого области действия для платформы авторизации, формат см. в соответствующем подклассе AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области по умолчанию. | ||
wechatOpen | ||||
ums.oauth.wechatOpen.clientId | Строка | client Id |
||
ums.oauth.wechatOpen.clientSecret | Строка | client Secret |
||
--------------------------------------------------------- | -------------- | ----------------------------------------------------------- | ------------------------------------------------------------ | -------------- |
wechatMp | ||||
ums.oauth.wechatMp.clientId | Строка | client Id |
||
ums.oauth.wechatMp.clientSecret | Строка | client Secret |
||
ums.oauth.wechatMp.scopes | List<Строка> | Поддерживает настраиваемое содержимое области действия для платформы авторизации, формат см. в подклассе соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
taobao | ||||
ums.oauth.taobao.clientId | Строка | client Id |
||
ums.oauth.taobao.clientSecret | Строка | client Secret |
||
ums.oauth.taobao.scopes | List<Строка> | Поддерживает настраиваемое содержимое области действия для платформы авторизации, формат см. в подклассе соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
ums.oauth.google.clientId | Строка | client Id |
||
ums.oauth.google.clientSecret | Строка | client Secret |
||
ums.oauth.google.scopes | List<Строка> | Поддерживает настраиваемое содержимое области действия для платформы авторизации, формат см. в подклассе соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
ums.oauth.facebook.clientId | Строка | client Id |
||
ums.oauth.facebook.clientSecret | Строка | client Secret |
||
ums.oauth.facebook.scopes | List<Строка> | Поддерживает настраиваемое содержимое области действия для платформы авторизации, формат см. в подклассе соответствующего AuthScope.getScope(). Обратите внимание: автоматически добавляются настройки области действия по умолчанию. | ||
github | ||||
ums.oauth.github.clientId | Строка | client Id |
||
ums.oauth.github.clientSecret | Строка | client Secret |
||
ums.oauth.github.scopes | List<Строка> | |||
---------------------------------------------------------------------- | ---------------------------------- | -------------------------- | --------------------------------------------------------------------------- | ------------------------------ |
ums.oauth.teambition.clientSecret | Строка | client Secret |
||
renren | ||||
ums.oauth.renren.clientId | Строка | client Id |
||
ums.oauth.renren.clientSecret | Строка | client Secret |
||
ums.oauth.renren.scopes | Список<Строка> | Поддерживает настраиваемое содержимое scope для платформы авторизации, формат | ||
см. в подклассе AuthScope.getScope(). Обратите внимание: автоматически добавляются | ||||
настройки по умолчанию. | ||||
ums.oauth.pinterest.clientId | Строка | client Id |
||
ums.oauth.pinterest.clientSecret | Строка | client Secret |
||
ums.oauth.pinterest.scopes | Список<Строка> | Поддерживает настраиваемое содержимое scope для платформы авторизации, формат | ||
см. в подклассе AuthScope.getScope(). Обратите внимание: автоматически добавляются | ||||
настройки по умолчанию. | ||||
stackOverflow | ||||
ums.oauth.stackOverflow.clientId | Строка | client Id |
||
ums.oauth.stackOverflow.clientSecret | Строка | client Secret |
||
ums.oauth.stackOverflow.stackOverflowKey | Строка | Stack Overflow Key | ||
ums.oauth.stackOverflow.scopes | Список<Строка> | Поддерживает настраиваемое содержимое scope для платформы авторизации, формат | ||
см. в подклассе AuthScope.getScope(). Обратите внимание: автоматически добавляются | ||||
настройки по умолчанию. | ||||
huawei | ||||
ums.oauth.huawei.clientId | Строка | client Id |
||
ums.oauth.huawei.clientSecret | Строка | client Secret |
||
ums.oauth.huawei.scopes | Список<Строка> | Поддерживает настраиваемое содержимое scope для платформы авторизации, формат | ||
см. в подклассе AuthScope.getScope(). Обратите внимание: автоматически добавляются | ||||
настройки по умолчанию. | ||||
wechatEnterprise 企业微信二维码版 | ||||
ums.oauth.wechatEnterprise.clientId | Строка | client Id |
||
----------------------------------------------------------------- | ------------------------------ | ------------------------------------------ | ------------------------------------------------------------ | ----------------------------------------------------- |
accessTokenRefreshJob | ||||
ums.executor.accessTokenRefreshJob.corePoolSize | Integer | 0 | Количество потоков, которые остаются незанятыми в пуле потоков. По умолчанию: 0 | |
ums.executor.accessTokenRefreshJob.keepAliveTime | Integer | 10 | Время поддержания активности потока. По умолчанию: 10 | |
ums.executor.accessTokenRefreshJob.timeUnit | TimeUnit | TimeUnit.MILLISECONDS | Единица времени для keepAliveTime. По умолчанию: миллисекунды | MILLISECONDS/MICROSECONDS/MILLISECONDS/SECONDS/MINUTES/HOURS/DAYS |
ums.executor.accessTokenRefreshJob.poolName | String | accessTokenJob | Имя пула потоков. По умолчанию: accessTokenJob | |
ums.executor.accessTokenRefreshJob.rejectedExecutionHandlerPolicy | RejectedExecutionHandlerPolicy | ABORT | Политика отказа. По умолчанию: ABORT | ABORT/CALLER_RUNS/DISCARD_OLDEST/DISCARD |
ums.executor.accessTokenRefreshJob.executorShutdownTimeout | Duration | PT10S | Время ожидания при завершении работы пула потоков. По умолчанию: PT10S | |
refreshToken |
Примечание: в ответе переведён только текст без кода. | 线程池名称, по умолчанию: updateConnection | | | ----------------------------------------------------------------------- | ------------------------------------------------------------ | | ums.executor.updateConnection.rejectedExecutionHandlerPolicy | RejectedExecutionHandlerPolicy | CALLER_RUNS | Стратегия отказа, по умолчанию: CALLER_RUNS. Обратите внимание: обычно не рекомендуется изменять настройки по умолчанию, если только вы не реализуете собственную логику обновления Auth2LoginAuthenticationProvider; также поддерживается ABORT, по умолчанию реализация Auth2LoginAuthenticationProvider является асинхронным обновлением, которое будет выполнено после отказа в выполнении, оно будет выполняться синхронно. | ABORT/CALLER_RUNS/DISCARD_OLDEST/DISCARD | | ums.executor.updateConnection.executorShutdownTimeout | Duration | PT10S | Время ожидания завершения работы пула потоков, по умолчанию: PT10S | |
Свойство | Тип | Значение по умолчанию | Описание | Возможные значения |
---|---|---|---|---|
ums.cache.redis.open | Boolean | false | Redis cache открыт, значение по умолчанию — false | true/false |
ums.cache.redis.useIocRedisConnectionFactory | Boolean | false | Следует ли использовать RedisConnectionFactory из контейнера Spring IOC, значение по умолчанию — false. Если используется RedisConnectionFactory из Spring IOC контейнера, необходимо обратить внимание на то, что cache.database-index должен совпадать со значением spring.redis.database | true/false |
Кэш | ||||
ums.cache.redis.cache.databaseIndex | Integer | 0 | Индекс базы данных Redis, где хранится кэш, значение по умолчанию — 0 | |
ums.cache.redis.cache.defaultExpireTime | Duration | PT200S | Устанавливает время истечения срока действия по умолчанию для кэша, управляемого менеджером кэша, значение по умолчанию — 200 секунд | |
ums.cache.redis.cache.entryTtl | Duration | PT180S | TTL кэша. Использование 0 означает создание постоянного кэша. Значение по умолчанию — 180 секунд. В качестве динамического случайного отклонения от 20% до верхнего и нижнего предела времени кэширования используется значение времени кэширования. Это предотвращает одновременное истечение срока действия кэша и «пробой» кэша | |
ums.cache.redis.cache.cacheNames | Set | Имена кэшей по умолчанию, которые следует учитывать при операциях кэширования, определённых в аннотированном классе |
Свойство | Тип | Значение по умолчанию | Описание | Возможные значения |
---|---|---|---|---|
Операторы инициализации базы данных | ||||
ums.repository.enableStartUpInitializeTable | Boolean | true | Следует ли проверять и автоматически создавать userConnectionTableName и authTokenTableName при запуске, значение по умолчанию TRUE |
true/false |
ums.repository.queryDatabaseNameSql | String | select database(); | Запрос имени базы данных, значение по умолчанию — mysql . |
|
ums.repository.authTokenTableName | String | auth_token | Имя таблицы базы данных для AuthTokenPo для третьей стороны, которая входит в систему |
|
ums.repository.queryAuthTokenTableExistSql | String | SELECT COUNT(1) FROM information_schema.tables WHERE table_name = '%s' AND table_schema = '%s'; | Запрос наличия authTokenTableName в базе данных. Обратите внимание, что %s в операторе SQL должен быть заполнен, а порядок %s должен соответствовать значению поля, соответствующему имени таблицы authTokenTableName , и имени базы данных |
|
ums.repository.createAuthTokenTableSql | String | Создание оператора создания таблицы для authTokenTableName . Обратите внимание, что sql оператор должен содержать %s , а порядок %s должен соответствовать полю, соответствующему authTokenTableName , database
|
Создание оператора создания таблицы для authTokenTableName . Обратите внимание, что sql оператор должен содержать %s , а порядок %s должен соответствовать полю, соответствующему authTokenTableName , database
|
Запрос 1 |
%s | Запрос к таблице пользователей базы данных сторонних логинов. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на : databaseName, tableName | | ums.repository.findUserIdsWithConnectionSql | String | select %s from %s where %s = ? and %s = ? | Запрос к таблице пользователей базы данных сторонних логинов для получения идентификаторов пользователей (userIds). Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: userIdColumnName, tableName, providerIdColumnName, providerUserIdColumnName |
Запрос 2
| ums.repository.findUserIdsConnectedToSql | String | select %s from %S where %s = :%s and %s in (:%s) | Запрос через стороннего поставщика услуг для получения userIds из таблицы пользователей по providerId и providerUserIds. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: userIdColumnName, tableName, providerIdColumnName, providerUserIdColumnName |
Запрос 3
| ums.repository.selectFromUserConnectionSql | String | select %s, %s, %s, %s, %s, %s, %s, %s, %s, %s from %s | Запрос через стороннего поставщика услуг для получения информации о пользователях по providerId и providerUserIds из таблицы пользователей. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: userIdColumnName, providerIdColumnName, providerUserIdColumnName, displayNameColumnName, profileUrlColumnName, imageUrlColumnName, accessTokenColumnName, tokenIdColumnName, refreshTokenColumnName, expireTimeColumnName, tableName |
Запрос 4
| ums.repository.updateConnectionSql | String | update %s set %s = ?, %s = ?, %s = ?, %s = ?, %s = ?, %s = ?, %s = ? where %s = ? and %s = ? and %s = ? | Запрос на обновление таблицы пользователей сторонних логинов. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: tableName, displayNameColumnName, profileUrlColumnName, imageUrlColumnName, accessTokenColumnName, tokenIdColumnName, refreshTokenColumnName, expireTimeColumnName, userIdColumnName, providerIdColumnName, providerUserIdColumnName |
Запрос 5
| ums.repository.addConnectionSql | String | insert into %s(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) | Запрос на добавление пользователя в таблицу пользователей сторонних логинов. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: tableName, userIdColumnName, providerIdColumnName, providerUserIdColumnName, rankColumnName, displayNameColumnName, profileUrlColumnName, imageUrlColumnName, accessTokenColumnName, tokenIdColumnName, refreshTokenColumnName, expireTimeColumnName |
Запрос 6
| ums.repository.addConnectionQueryForRankSql | String | select coalesce(max(%s) + 1, 1) as %s from %s where %s = ? and %s = ? | Запрос для определения необходимого значения ранга при добавлении пользователя в таблицу пользователей. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: rankColumnName, rankColumnName, tableName, userIdColumnName, providerIdColumnName |
Запрос 7
| ums.repository.removeConnectionsSql | String | delete from %s where %s = ? and %s = ? | Запрос на удаление нескольких пользователей из таблицы пользователей на основе userId и providerId. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: tableName, userIdColumnName, providerIdColumnName |
Запрос 8
| ums.repository.removeConnectionSql | String | delete from %s where %s = ? and %s = ? and %s = ? | Запрос на удаление одного пользователя из таблицы пользователей на основе userId, providerId, providerUserId. Обратите внимание: в запросе необходимо заполнить %s, знаки вопроса должны соответствовать указанным %s, а %s будут последовательно заменены на: tableName, userIdColumnName, providerIdColumnName, providerUserIdColumnName |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )