GRAILS + Spring Security Plugin ---添加用户时密码未加密

时间:2017-06-07 19:50:54

标签: grails spring-security password-encryption

! NOOB ALERT!

Grails 3.2.9 + Spring Security Plugin 3.1.0的清洁安装。

由s2-quickstart com.raf.app用户角色创建的默认用户/角色/ UserRole域。

BootStrap初始化代码:

...
def init = { servletContext ->
    def adminRole = Role.findOrSaveWhere(authority: 'ROLE_ADMIN')
    def user = User.findOrSaveWhere(username: 'raf',
            password: 'password')
    if (!user.authorities.contains(adminRole)){
        UserRole.create(user, adminRole)
    }
...

我在一个教程中看到这个用户的密码应该在db中编码(使用dbconsole来检查这个),但在我的情况下它没有(它只是'密码&#39 ;就像在这里)。

所以我去了用户域并做出了这些可怕的改变:

def beforeUpdate() {
        encodePassword()
    }

    protected void encodePassword() {
        password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : springSecurityService.encodePassword(password)
    }

另一方面,这会引发NullPointer异常。为什么呢?

 Cannot invoke method encodePassword() on null object

那么我该怎样做才能加密我的密码,比如我喜欢' em?

3 个答案:

答案 0 :(得分:1)

所以要解释发生了什么,希望它更有意义

如果无法找到编码,您只需告诉代码重复加密功能。

默认情况下,上面的代码在这里

 password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password

这说:

if (springSecurityService?.passwordEncoder) {
springSecurityService.encodePassword(password) 
} else {
password
}

所以你看到你告诉它做了它不能做的事情

我正在使用grails 3.2.8并使用:

compile 'org.grails.plugins:spring-security-core:3.1.2'

答案 1 :(得分:1)

好的,所以我相信NullPointer是由vahid所描述的引起的。

但是,要默认编码我的密码,我必须设置

autowire: true

在Configs / application.yml中。不要问我为什么,但它确实有效。

答案 2 :(得分:1)

如果您使用设置的命令手动设置了Spring Security。也许您忘了添加UserPasswordEncoderListener类,并在resources.groovy中将其定义为bean。此类应自动对密码进行编码


UserPasswordEncoderListener:

import grails.plugin.springsecurity.SpringSecurityService
import groovy.transform.CompileStatic
import org.grails.datastore.mapping.core.Datastore
import org.grails.datastore.mapping.engine.event.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.ApplicationEvent

@CompileStatic
class UserPasswordEncoderListener extends AbstractPersistenceEventListener {

    @Autowired
    SpringSecurityService springSecurityService

    UserPasswordEncoderListener(final Datastore datastore) {
        super(datastore)
    }

    @Override
    protected void onPersistenceEvent(AbstractPersistenceEvent event) {
        if (event.entityObject instanceof User) {
            User u = (event.entityObject as User)
            if (u.password && (event.eventType == EventType.PreInsert || (event.eventType == EventType.PreUpdate && u.isDirty('password')))) {
                event.getEntityAccess().setProperty("password", encodePassword(u.password))
            }
        }
    }

    @Override
    boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        eventType == PreUpdateEvent || eventType == PreInsertEvent
    }

    private String encodePassword(String password) {
        springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password
    }
}

resources.groovy

beans = {
    userPasswordEncoderListener(UserPasswordEncoderListener, ref('hibernateDatastore'))
}

UserPasswordEncoderListener应该放在src/main/groovy/com.mypackage...