2012-03-07 149 views
2

我想在我的Grails应用程序中使用MongoDB,还想在Spring Security中使用MongoDB。我使用s2-quickstart命令生成了User和Role类。我在ObjectId类型的所有课程中添加了id属性,正如许多博客文章中所述。与MongoDB一起使用Spring Security

它的工作,但一个方法困扰我一点点:

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

isDirty()似乎是在MongoDB的环境不可用的方法。它使用Hibernate可以正常工作。这是一个错误提交下http://jira.grails.org/browse/GPMONGODB-114

有没有办法绕过这种方法?据我所知,它检查密码是否被修改,然后再次编码。

手动操作是不可能的?例如,如果我有一个用户配置文件其中包含密码字段的页面,我只是将它重新编码保存?

我真的很想同时使用Spring Security和MongoDB,我相信这种方法不会阻止我。 ;)

回答

1

我看不出为什么你无法创建自己的UserDetailsS​​ervice,它从Mongo加载散列密码,然后在你的AuthenitcationManager中使用PasswordEncoder。这会告诉Spring在将用户输入的密码与从mongo中检索的值进行比较之前对其进行哈希处理。

我无法对Grails方面发表评论,但我们正在使用Spring安全和Mongo密码。我们实际上有一个自定义密码编码器,使用迭代哈希/盐,所以我确定你想要的是可能的:)

+0

什么是UserDetailsS​​ervice?我在GitHub的一个示例应用程序中看到了这个类,但它没有生成。这只是一件好事吗?我目前没有看到使用它的好处。我只是扔掉'... before()'方法之后,创建一个新的'User'对象,并且手动设置腌制/散列密码,而不是'User'对象本身。奇迹般有效。我想很多事情都是由Grails插件或Spring Security自动完成的,不需要明确配置。 – 2012-03-07 22:22:35

+0

最后标记你的答案是正确的,因为在每次保存或更新用户时实施密码散列是使用Grails和MongoDB的唯一方法,因为'isDirty()'仅在Hibernate中受支持。虽然伤害不大 – 2012-03-19 21:21:32