与MongoDB一起使用Spring安全性

与MongoDB一起使用Spring安全性,mongodb,spring-security,grails-2.0,Mongodb,Spring Security,Grails 2.0,我想在Grails应用程序中使用MongoDB,还想在Spring安全性中使用MongoDB。我使用s2 quickstart命令生成了用户类和角色类。正如在许多博客文章中所说的那样,我将id属性添加到我所有类型的ObjectId类中 它确实有效,但有一种方法让我有点困扰: // SecUser.groovy (generated by s2-quickstart) def beforeUpdate() { if (this.isDirty('password')) {

我想在Grails应用程序中使用MongoDB,还想在Spring安全性中使用MongoDB。我使用
s2 quickstart
命令生成了用户类和角色类。正如在许多博客文章中所说的那样,我将
id
属性添加到我所有类型的
ObjectId
类中

它确实有效,但有一种方法让我有点困扰:

    // SecUser.groovy (generated by s2-quickstart)
def beforeUpdate() {
    if (this.isDirty('password')) {
        encodePassword()
    }
}
方法
isDirty()
在MongoDB环境中似乎不可用。使用Hibernate可以很好地工作。这是一个根据

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

难道不可能手动执行此操作吗?例如,如果我有一个包含密码字段的用户配置文件页面,我只需在保存时对其再次编码


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

我看不出为什么您不能创建自己的UserDetails服务,该服务从Mongo加载哈希密码,然后在AuthenitActionManager中使用密码编码器。这将告诉Spring在将用户输入的密码与您从mongo检索到的值进行比较之前对其进行散列


我不能评论Grails方面,但我们在Mongo中使用Spring安全性和哈希密码。实际上,我们有一个自定义密码编码器,它使用迭代哈希/salt,因此我确信您可能需要:)

用户详细信息服务是用于什么的?我在GitHub上的一个示例应用程序中看到了这个类,但它并没有生成。这只是一件美好的事情吗?我目前认为使用它没有任何好处。我刚刚抛弃了…()之前的
方法,创建了一个新的
User
对象,并“手动”而不是
User
对象本身设置了salt/hash密码。工作起来很有魅力。我猜很多事情都是由Grails插件或Spring安全本身自动完成的,不需要显式配置。最后,将您的答案标记为正确,因为在用户的每次保存或更新上实现密码哈希是Grails和MongoDB的唯一方法,因为
isDirty()
仅在Hibernate中受支持。不过没什么害处