Код: Выделить всё
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()
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