2015-12-11 4 views
1

Я пытаюсь выполнить миграцию старого приложения Grails от AppFog до Linode серверов. Я перенесла код и базу данных MYSQL, но я не смог войти в систему со старыми учетными данными.Безопасность Grails и Spring: пароль недействителен через некоторое время?

По какой-то причине я подозревал, что забыл пароль, поэтому я просто удалил своего пользователя непосредственно из базы данных, и пусть Bootstrap.groovy создает новый с известным паролем, поэтому мне снова удалось войти в систему.

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

Снова, мне удалось войти в систему через GUI и даже (через GUI) пароль для обновления для других пользователей (пользователь от Bootstrap.groovy имеет роль администратора). Я проверил, что все хэши паролей были обновлены в базах данных, и я проверил каждую учетную запись через графический интерфейс, все было в порядке.

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

Единственное, что я заметил, это другое - это формат хэшированного пароля: ранее это была последовательность символов и цифр, но теперь она всегда начинается с $2a$ и содержит специальные символы.

Я заметил несколько форумов и SO сообщение о том, что использование spring-security-gui может привести к двойному хэшированию паролей, но я не использую этот плагин.

Вот список (соответствующих) плагинов, которые я использую:

  • кот: 7.0.52.1
  • гибернации: 3.6.10.9
  • базы данных миграции: 1.3.8"
  • весна-безопасности ядра: 2,0-RC4"

Я просто заметил, что старая версия приложения использует spring-security-core:1.2.7.3 и последний один использует 2.0-RC4 (Я обновил некоторые устаревшие плагины перед миграцией)

UPDATE: К сожалению, проблема по-прежнему активна. Я загрузил пользователя и подтвердил, что пароль хэшируется в формате «sha». Я могу войти в систему с этим пользователем и изменить пароли других пользователей. Я проверил, что все пароли sha hashed в базе данных. Я могу зарегистрировать с каждым пользователем, что я сбросил пароль, включая bootstraped. Через один день (примерно) я не могу снова регистрироваться с ранее использованными credentails для любого пользователя. Я проверил базы данных и хэши паролей такие же, как и раньше. Ничего в журналах tomcat, mysql или syslog. То же приложение было запущено на AppFog более одного года без перезагрузки и никаких проблем не было замечено. Я не уверен на 100%, что версия плагина весной безопасности была использована на сайте AppFog (унаследованное обслуживание), но единственное, что изменилось, это версия этого плагина (если раньше он не использовался). Не существует фоновых заданий, которые могут вызвать это поведение (например, вызовы user.save()), поэтому я не знаю, что может пойти не так, или что еще мне нужно установить.

+0

, связанные с «через некоторое время», - скорее всего, у вас есть 'user.save()' где-то, вероятно msot на Идент.польз, который заменяет существующий хэш с новым одним –

ответ

1

Установить следующие два свойства в вашем Config.groovy

grails.plugin.springsecurity.password.algorithm = "SHA-256" 
grails.plugin.springsecurity.password.hash.iterations = 1 

Это также позволит вам войти в систему со старым паролем. Spring Security 1.x использует SHA-256, но новая Spring Security 2.x теперь использует алгоритмы bcrypt.

http://grails-plugins.github.io/grails-spring-security-core/v2/guide/newInV2.html

+0

Thx много, что работал! Тем не менее, мне любопытно, что придумал эту ситуацию, что пароль стал недействительным через некоторое время ... – zbubric

+0

Есть ли работа, которая обновляет экземпляр пользователя? Кроме того, можете ли вы показать мне свой домен пользователя –

+0

Нет никаких заданий backgroud, поэтому ничего на этой стороне. Что касается моего домена пользователя, рядом с основными свойствами и ограничениями, здесь только три методов (извините, не знаю, как формат комментарий): \t Защиту beforeInsert() { \t \t encodePassword() \t} \t Защиту BeforeUpdate () { \t \t если (isDirty ('пароль')) { \t \t \t encodePassword() \t \t} \t} \t защищен недействительным encodePassword() { \t \t password = springSecurityService.encodePassword (password) \t} – zbubric