我创建了一个 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 用户名的唯一约束,我怎么可能为用户预先定义任何数据?
快速谷歌搜索提出了一些建议(link1,Grails 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 生成的FacebookUser
,AppUser
唯一的变化是添加static hasMany = [surveys: Survey]
到 AppUser。