2012-03-07 3 views
2

Я хотел использовать MongoDB в своем приложении Grails, а также Spring Security. Я создал как пользовательские, так и ролевые классы с помощью команды s2-quickstart. Я добавил свойство id ко всем моим классам типа ObjectId, как он говорит во многих блогах.Использование Spring Security вместе с MongoDB

Это делает работу, но один метод беспокоит меня немного:

// SecUser.groovy (generated by s2-quickstart) 
def beforeUpdate() { 
    if (this.isDirty('password')) { 
     encodePassword() 
    } 
} 

isDirty() метод, кажется, отсутствует в среде MongoDB. Он отлично работает с использованием Hibernate. Это ошибка, зарегистрированная под http://jira.grails.org/browse/GPMONGODB-114

Есть ли способ обойти этот метод? Насколько я понимаю, он проверяет, был ли пароль изменен, а затем снова закодирует его.

Нельзя ли это сделать вручную? Например, если у меня есть профиль пользователя , в котором есть поле пароля, я просто закодирую его снова при сохранении?

Я бы очень хотел использовать как Spring Security, так и MongoDB вместе, и я уверен, что этот метод не остановит меня. ;)

ответ

1

Я не вижу причин, по которым вы не можете создать свой собственный UserDetailsService, который загружает хешированный пароль из Mongo, а затем использует PasswordEncoder в AuthenitcationManager. Это сообщит Spring, чтобы хэш введенный пользователем пароль, прежде чем сравнивать его со значением, полученным вами от mongo.

Я не могу комментировать аспекты Grails, но мы используем Spring security и хэшируем пароли с помощью Mongo. У нас на самом деле есть собственный кодировщик паролей, который использует итеративный хеш-соль, поэтому я уверен, что вы хотите :)

+0

Что такое 'UserDetailsService'? Я видел этот класс в примере приложения на GitHub, но он не был сгенерирован. Это просто хорошая вещь? В настоящее время я не вижу никаких преимуществ при использовании. Я просто выбросил методы 'before ...()' и создал новый объект 'User' и установил пароль соленых/хэшированных« вручную », а не сам объект« Пользователь ». Работает как шарм. Я думаю, что многое можно сделать с помощью плагина Grails или самой Spring Security, которая не обязательно должна быть явно настроена. –

+0

Наконец, ваш ответ был правильным, так как реализация хэширования паролей при каждом сохранении или обновлении пользователя - единственный способ пойти с Grails и MongoDB, так как 'isDirty()' поддерживается только в Hibernate. Не сильно больно, хотя –

Смежные вопросы