1

我创建了一个 grails 应用程序,该应用程序使用 spring security 允许用户通过 facebook 进行身份验证,并且我可以成功地将 facebook 用户名打印到其中一个视图上,到目前为止我没有任何问题。

我的问题在于尝试使用给定 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 报告的错误,我可以看到上述错误的根源位于DefaultFacebookAuthDao第 135 行,其中提到了以下内容:

AppUserDomainClazz.withTransaction {
                    appUser.save(flush: true, failOnError: true)
                }

因此,通过身份验证,spring security 尝试保存用户域对象......

编辑 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)

两者都是通过 spring security facebook quickstart 生成的FacebookUserAppUser唯一的变化是添加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”用户名。

有两种方法:或者更改在 Bootstrap 中创建的用户的用户名(如果它不是 Facebook 用户),或者也创建一个 Facebook 用户(将用于身份验证)。

于 2013-02-04T03:32:08.480 回答