! 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?
答案 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...
下