春のセキュリティを使用してユーザーが Facebook 経由で認証できるようにする grails アプリを作成しました。Facebook のユーザー名をビューの 1 つに正常に出力できるので、これまでのところ問題はありません。
私の問題は、特定の facebook ユーザーのサンプルデータを使用してアプリケーションをブートストラップしようとするときにあるため、アプリケーションを起動するたびに入力する必要はありません。
これは、私が自分の Facebook アカウントをブートストラップしようとしている方法ですBootstrap.groovy
。
def adminRole = new AppRole(authority: 'ROLE_ADMIN').save(flush: true)
def userRole = new AppRole(authority: 'ROLE_USER').save(flush: true)
def testUser = new AppUser(username: 'facebook_563645402', enabled: true,
password: 'my-hashed-pw-here',
surveys: [jamies])
testUser.save(flush: true)
AppUserAppRole.create testUser, adminRole, true
記録のhasMany
ために、上記の調査フィールドを AppUser に追加しました。
アプリを起動して接続しようとすると、次のエラーが発生します。
URI
/web/j_spring_security_facebook_check
Class
grails.validation.ValidationException
Message
Validation Error(s) occurred during save(): - Field error in object 'web.AppUser' on field 'username': rejected value [facebook_563645402]; codes [web.AppUser.username.unique.error.web.AppUser.username,web.AppUser.username.unique.error.username,web.AppUser.username.unique.error.java.lang.String,web.AppUser.username.unique.error,appUser.username.unique.error.web.AppUser.username,appUser.username.unique.error.username,appUser.username.unique.error.java.lang.String,appUser.username.unique.error,web.AppUser.username.unique.web.AppUser.username,web.AppUser.username.unique.username,web.AppUser.username.unique.java.lang.String,web.AppUser.username.unique,appUser.username.unique.web.AppUser.username,appUser.username.unique.username,appUser.username.unique.java.lang.String,appUser.username.unique,unique.web.AppUser.username,unique.username,unique.java.lang.String,unique]; arguments [username,class web.AppUser,facebook_563645402]; default message [Property [{0}] of class [{1}] with value [{2}] must be unique]
ユーザー名が一意ではないことに不満を持っているようです。
一部のデータをブートストラップしようとして、Facebook ユーザー名の一意の制約を破る場合、ユーザーのデータを事前に定義するにはどうすればよいですか?
簡単なグーグル検索でいくつかの提案が表示されます ( link1、Grails spring security bootstrap、しかしこれまでのところ役に立たなかった、何かアイデアはありますか?
編集: grails が報告するエラーを詳しく調べると、上記のエラーのルートがDefaultFacebookAuthDao
135 行目にあり、次のことが言及されていることがわかります。
AppUserDomainClazz.withTransaction {
appUser.save(flush: true, failOnError: true)
}
したがって、認証により、春のセキュリティはユーザードメインオブジェクトを保存しようとします...
編集2:
これは私のBootstrap.groovy
def testUser = new AppUser(username: 'facebook_563645402', enabled: true,
password: 'my-hashed-pw', surveys: [new Survey(1)])
testUser.save()
def fbUser = new FacebookUser(uid: 563645402)
fbUser.save(flush: true)
FacebookUser
とは両方ともAppUser
、春のセキュリティ facebook クイックスタートを介して生成され、唯一の変更はstatic hasMany = [surveys: Survey]
AppUser に追加することです。