Ошибка аутентификации Spring после восстановления базы данных

Обновлено: Эта проблема оказалась ошибкой пользователя, пароли были изменены, поэтому хэш никогда не совпадал.

Я использую простую аутентификацию в наборе инструментов Spring 4.2.2, используя DAO, который считывает таблицу базы данных (Postgres) для имени пользователя, пароля и полномочий.

@EnableWebSecurity
@Configuration
class X extends WebSecurityConfigurerAdapter{

    ...
    @Autowired
    private SessionRegistry sessionRegistry;

    @Autowired
    private SessionAuthenticationStrategy sessionAuthenticationStrategy;


    @Override
    protected void configure(HttpSecurity http){
       http.sessionManagement().sessionAuthenticationStrategy(sessionAuthenticationStrategy).maximumSessions(1).sessionRegistry(sessionRegistry).expiredUrl("/login.jsp");

    //presumably unrelated additional code related to matchers, roles, https
    }

    @Bean
    public SessionRegistry sessionRegistry(){
        return new SessionRegistryImpl();
    }

    @Bean
    public SessionAuthenticationStrategy sessionAuthenticationStrategy(){
        return new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry);
    }

    @Bean 
    public PasswordEncoder passwordEncoder(){
       return new StandardPasswordEncoder();   
    }

   ...
}

Недавно я восстановил старую копию базы данных, старая база данных взята с сервера Redhat 6, новая — CentOS 7, хотя на самом деле, поскольку все это поддерживается базой данных, это не должно иметь значения. Часть аутентификации нашего кода совсем не изменилась, но поскольку я восстановил базу данных, несмотря на ввод правильных учетных данных, я получаю

BadCredentialsException: Bad credentials at 
org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:98) at
org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:165) at   org.springframework.security.authentication.ProvideManager.authenticate(ProviderManager.java:167) at
....  

Остальная часть трассировки стека - это все более стандартные биты трассировки стека spring/catalina/java, ничего нестандартного.

Он не просрочен, я удалил куки, он не отключен....

Этот код не изменился буквально за несколько лет, равно как и таблицы резервной базы данных или библиотеки Spring. Отладка Я могу подтвердить, что правильный пользователь извлекается по имени пользователя, поскольку он идет к аутентификации, что объект пользователя правильно создан с хэшем пароля и полномочиями. Поскольку большая часть этого выполняется поведением классов Spring по умолчанию, я не могу пройти через большую часть кода, как это происходит, поэтому очень сложно определить, где произошли фактические неверные учетные данные и что, черт возьми, могло измениться.

Погуглив, я обнаружил, что у многих пользователей есть проблемы, но почти все они имеют дело с изначально плохой конфигурацией. Это не такая уж проблема, так как этот код работал.

Есть ли какие-либо известные ошибки, связанные с безопасностью Spring, которые я мог бы проверить?

В противном случае, как я могу сортировать это дальше?

Может быть полезно упомянуть продукт базы данных - например. MySQL, PostgreSQL и др.

Catchwa 31.05.2019 01:47

@Catchwa хорошая мысль, Postgres для протокола, я отредактирую, как только вернусь к клавиатуре

InfernalRapture 31.05.2019 03:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Еще несколько вещей, чтобы попробовать:

  1. Убедитесь, что сопоставление базы данных и набор символов совпадают как в старой, так и в новой среде.
  2. Есть ли у вас способ в вашем приложении (или вы могли бы написать какой-нибудь простой код) для сброса пароля, а затем попробуйте войти в систему с новым сброшенным паролем (или просто напишите какой-нибудь быстрый код для создания нового, который, как вы знаете, правильный, а затем установить его непосредственно против базы данных)? Если это работает, посмотрите на формат нового пароля по сравнению с другими в базе данных.
  3. Подключите свой собственный DaoAuthenticationProvider, который позволяет вам установить точку останова (или просто записывать в консоль/файл) сгенерированный хэш пароля по сравнению с базой данных.
  4. Реализуйте свой собственный StandardPasswordEncoder (из здесь), но снова добавьте больше логов/брейкпойнтов

О боже, я надеюсь, что это не так неприятно, как изменение кодировки символов по умолчанию между двумя младшими версиями базы данных, но это хорошая мысль.

InfernalRapture 31.05.2019 03:31

Подтверждено, что и старый, и новый находятся в UTF-8, так что это не простая проблема с кодировкой.

InfernalRapture 31.05.2019 16:00

Воссоздание пользователя действительно помогло, но, к сожалению, это нежизнеспособный вариант, потому что каскадное удаление сдуло слишком много его исходных данных.

InfernalRapture 31.05.2019 16:34

Включив себя в процесс, он, кажется, терпит неудачу, потому что он отклоняет хэш, но, к сожалению, я не понимаю, почему. Я предполагаю, что это как-то связано с солью, но мне непонятно, почему это было бы правдой, поскольку я думал, что используемая соль была добавлена ​​​​как последние несколько байтов хэш-кода.

InfernalRapture 04.06.2019 00:15

Я предлагаю создать собственную версию StandardPasswordEncoder и добавить больше элементов отладки/логирования: github.com/spring-projects/spring-security/blob/4.2.x/crypto‌​/…

Catchwa 04.06.2019 01:36

Я почти уверен, что на данный момент я определил проблему, к сожалению. Я почти уверен, что StandardPasswordEncoder имеет «секретную» последовательность байтов, специфичную для сервера.

InfernalRapture 04.06.2019 03:25

Вы можете посмотреть код, на который я ссылаюсь - конструктор без аргументов приводит к пустому секрету

Catchwa 04.06.2019 03:27

обернув StandardPasswordEncoder в пользовательский класс (он окончательный, поэтому я не могу его расширить), я смог определить, что секрет на самом деле представляет собой массив байтов нулевой длины. Он использует Springframework Digester, который довольно скучен, поскольку классы идут, я действительно не уверен, как дальше отлаживать....

InfernalRapture 04.06.2019 17:00

Вероятно, это не поможет, но я имел в виду просто скопировать весь файл StandardPasswordEncoder, поместить его в ваше приложение локально, а затем отредактировать его так, как вы хотите. Это дало бы вам неограниченную возможность входа в систему, где бы вы ни захотели.

Catchwa 05.06.2019 01:08

Во-первых, большое спасибо за все ваше время и помощь. Как оказалось, они изменили пароли пользователя-администратора, и хеш должен законно не совпадать, потому что они не сказали мне, что мои учетные данные были НЕПРАВИЛЬНЫМИ. Так что я копал кроличью нору без дна.

InfernalRapture 05.06.2019 18:31

Другие вопросы по теме