2012-03-07 15 views
2

GrailsアプリケーションとSpring SecurityでMongoDBを使いたかったのです。 s2-quickstartコマンドを使用してUserクラスとRoleクラスの両方を生成しました。私はidプロパティを、多くのブログ記事で言うように、ObjectIdタイプのすべてのクラスに追加しました。Spring SecurityとMongoDBの併用

それは作業を行いますが、一つの方法は私に少し気:

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

MongoDBの環境では使用できないように思わisDirty()方法。これは、Hibernateを使ってうまく動作します。これはhttp://jira.grails.org/browse/GPMONGODB-114の下に提出されたバグです

この方法を回避する方法はありますか?私が理解する限り、パスワードが変更されたかどうかを確認してから再度エンコードします。

これを手動で行うことはできませんか?たとえば、ユーザープロフィールのページにパスワードフィールドが含まれている場合、保存時に再度エンコードするだけですか?

私はSpring SecurityとMongoDBの両方を一緒に使いたいと思っています。私はこの方法が私を止めないと確信しています。 ;)

答えて

1

Mongoからハッシュされたパスワードをロードする独自のUserDetailsS​​erviceを作成できないため、AuthenitcationManagerでPasswordEncoderを使用する理由はありません。これは、Springがmongoから取得した値と比較する前に、ユーザーが入力したパスワードをハッシュするように指示します。

私はGrailsの側面にはコメントできませんが、SpringセキュリティとMongoでパスワードをハッシュしています。私たちは実際に反復的なハッシュ/塩を使用するカスタムパスワードエンコーダを持っていますので、あなたが望むものが可能であると確信しています:)

+0

'UserDetailsS​​ervice'は何ですか? GitHubのサンプルアプリケーションでこのクラスを見ましたが、生成されませんでした。これはちょうど良いことですか?私は現在、それを使用することでどんな利点も見ません。私は 'before ...()'メソッドを投げ捨て、新しい 'User'オブジェクトを作成し、' User'オブジェクト自体ではなく、手作業で塩漬け/ハッシュされたパスワードを設定しました。魅力のように動作します。 GrailsのプラグインやSpring Security自体では、明示的に設定する必要はありませんが、自動的に多くのことが行われると思います。 –

+0

'isDirty()'はHibernateでしかサポートされていないので、GrailsとMongoDBを使う唯一の方法は、ユーザの保存や更新時にパスワードハッシュを実装することだけです。しかし、あまり傷つかない –