Spring Authorization Server ~ Как перерегистрировать по умолчанию Authentication ProvidersJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Spring Authorization Server ~ Как перерегистрировать по умолчанию Authentication Providers

Сообщение Anonymous »

Я пытаюсь реализовать аутентификацию OAuth2 для приложения в бэкэнд с помощью Spring Boot с использованием сервера авторизации Spring. Моя проблема заключается в том, что у меня есть пользовательская логика, которая использует свои собственные аутентификационные провидеры, однако Spring Authentication Server автоматически добавляет целую кучу поставщиков по умолчанию, которые не могут обрабатывать мою пользовательскую логику, а затем сбой. Я хочу выяснить, как я могу избавиться от провидеров аутентификации по умолчанию, чтобы не произошло сбоев. В моей собственной аутентификации токена обновления у меня есть немного, которая проверяет, соответствует ли Device_id (пользовательское поле, которое мы используем), соответствует сохраненному Device_id и бросает OAuth2AuthenticationException, если это не так. < /P>

Код: Выделить всё

        if (!providedDeviceId.equals(storedDeviceId)) {
String errorMessage = "Provided device ID '" + providedDeviceId
+ "' did not match stored device ID '" + storedDeviceId
+ "' for refresh token '" + refreshTokenValue + "'";
log.warn(errorMessage);
throw new OAuth2AuthenticationException(
new OAuth2Error(OAuth2ErrorCodes.INVALID_GRANT, errorMessage, null)
);
}
< /code>
Эта логика работает просто отлично. Однако в классе Framework org.springframework.security.authentication.providermanager 
метод аутентификации работает так:

Код: Выделить всё

    @Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
[...]
for (AuthenticationProvider provider : getProviders()) {
if (!provider.supports(toTest)) {
continue;
}
[...]
try {
result = provider.authenticate(authentication);
if (result != null) {
copyDetails(authentication, result);
break;
}
}
catch (AccountStatusException | InternalAuthenticationServiceException ex) {
prepareException(ex, authentication);
// SEC-546: Avoid polling additional providers if auth failure is due to
// invalid account status
throw ex;
}
catch (AuthenticationException ex) {
lastException = ex;
}
}
< /code>
то есть он итерации по всем провидерам аутентификации, которые поддерживают тип аутентификации, и разрываются только в том случае, если он удастся, или AccountStatusException или InternalAuthenticationsExexception. Обратите внимание, что он не нарушает Authentication Exception, как я и ожидал, что она будет работать. Вместо этого он продолжает итерацию по сравнению с оставшимися провинщиками аутентификации, которые поддерживают тип аутентификации. И это приводит меня к моей проблеме: < /p>
getProviders()
возвращает не одного, а двух поставщиков, которые номинально поддерживают OAuth2refreshtokenAuthenticationToken: My Specual Oauth2refreshtokenauthprovider и по умолчанию org.springframework.security.oauth2.server.authorization.Authentication.Oauth2refreshteAtrentifortication>. С другой стороны, мой собственный провайдер называется первым и правильно бросает его OAuth2AuthenticationException, если Device_ID несоответствует. К сожалению, однако, Spring OAuth2refreshtokenAuthenticationProvider называется следующим и сталкивается с этой ошибкой: < /p>
java.lang.IllegalArgumentException: value cannot be null
at org.springframework.util.Assert.notNull(Assert.java:181)
at org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext$AbstractBuilder.put(OAuth2TokenContext.java:219)
at org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext$AbstractBuilder.principal(OAuth2TokenContext.java:152)
at org.springframework.security.oauth2.server.authorization.authentication.OAuth2RefreshTokenAuthenticationProvider.authenticate(OAuth2RefreshTokenAuthenticationProvider.java:171)
at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)
at org.springframework.security.authentication.ObservationAuthenticationManager.lambda$authenticate$1(ObservationAuthenticationManager.java:54)
at io.micrometer.observation.Observation.observe(Observation.java:564)
at org.springframework.security.authentication.ObservationAuthenticationManager.authenticate(ObservationAuthenticationManager.java:53)
< /code>
Я мог бы подробно рассказать о том, почему это Assert.notnull не работает. Короткая версия заключается в том, что Spring OAuth2refreshtokenAuthenticationProvider не может проверить Device_ID, потому что это пользовательское поле, и это вызывает проблемы дальше по линии. Но на самом деле это не главное. Основная проблема в моих глазах состоит в том, что весна oauth2refreshtokenauthenticationprovider вообще называется. Я хочу, чтобы вместо этого называется мой пользовательский oauth2refreshtokenauthprovider, а не в дополнение к поставщику по умолчанию, поскольку это то, для чего я его написал.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... nproviders
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»