1

春のセキュリティを使用してユーザーが 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 ユーザー名の一意の制約を破る場合、ユーザーのデータを事前に定義するにはどうすればよいですか?

簡単なグーグル検索でいくつかの提案が表示されます ( link1Grails spring security bootstrap、しかしこれまでのところ役に立たなかった、何かアイデアはありますか?

編集: grails が報告するエラーを詳しく調べると、上記のエラーのルートがDefaultFacebookAuthDao135 行目にあり、次のことが言及されていることがわかります。

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 に追加することです。

4

2 に答える 2

0

データはすでに事前定義されているようです。そうでない場合、一意の制約違反は発生しません。データの存在を確認し、必要な場合にのみ作成してください。

def adminRole = AppRole.findOrSaveByAuthority('ROLE_ADMIN')
def userRole = AppRole.findOrSaveByAuthority('ROLE_USER')

String username = 'facebook_563645402'

if (!AppUser.findByUsername(username)) {
   def testUser = new AppUser(username: username, enabled: true,
                              password: 'my-hashed-pw-here')
   testUser.addToSurveys(jamies)
   testUser.save()

   AppUserAppRole.create testUser, adminRole, true
}
于 2013-02-03T18:58:48.793 に答える
0

Spring Security Facebook は、同じユーザー名 ( ) で新しいユーザーを作成しようとしますfacebook_563645402。では見つけられないからuidです。

あなたのコードからわかるように、ユーザーを作成するだけで、塗りつぶされていますusernameが、それは Facebook ユーザーでuidはなく、フィールドは入力されていません。そのため、プラグインは facebook ユーザーを見つけることができず、デフォルトで「facebook_563645402」ユーザー名を使用して新しいユーザーを作成しようとします。

2つの方法は、Bootstrapで作成されたユーザーのユーザー名(Facebookユーザーではない場合)を変更するか、Facebookユーザーも作成します(認証に使用されます)。

于 2013-02-04T03:32:08.480 に答える