Spring Security 插件提供了一个名为“springSecurityService”、类型为 grails.plugins.springsecurity.SpringSecurityService 的 bean。我需要重写此服务的 getCurrentUser
方法。
我首先尝试使用扩展来做到这一点
class CustomSecurityService extends SpringSecurityService {
@Override
Object getCurrentUser() {
// my implementation uses methods from the parent class
}
}
为了用上面的类的实例替换插件定义的 bean,我将以下内容添加到 resources.groovy
springSecurityService(CustomSpringSecurityService)
但这不起作用,因为没有设置 SpringSecurityService
(我正在扩展的类)的任何依赖项,因此我得到了 NullPointerExceptions。未设置这些依赖项的原因是因为不再有 SpringSecurityService
因此,我转向委托(delegate):
import grails.plugins.springsecurity.SpringSecurityService as PluginSpringSecurityService
class CustomSpringSecurityService {
@Autowired @Delegate
PluginSpringSecurityService pluginSpringSecurityService
Object getCurrentUser() {
// my implementation uses methods from pluginSpringSecurityService
}
}
然后我在resources.groovy
中定义了两个bean
springSecurityService(CustomSpringSecurityService)
pluginSpringSecurityService(grails.plugins.springsecurity.SpringSecurityService)
在第二次尝试中,我再次希望名为“springSecurityService”的 bean 引用 CustomSpringSecurityService
,但我还需要一个 grails.plugins.springsecurity.SpringSecurityService
类型的 bean >,因为我的 getCurrentUser
实现使用了该 bean 的一些其他方法。
但是,我再次发现 pluginSpringSecurityService
的依赖项没有被设置。是否有更简单的方法可以在受依赖注入(inject)的上下文中重写由插件提供的 bean 方法?
最佳答案
返回到子类化并重新定义 resources.groovy
中的 bean,但满足依赖关系。它们是按名称自动注入(inject)的,但全部列出,因此请将它们显式添加到您的重新定义中:
springSecurityService(CustomSpringSecurityService) {
authenticationTrustResolver = ref('authenticationTrustResolver')
grailsApplication = ref('grailsApplication')
passwordEncoder = ref('passwordEncoder')
objectDefinitionSource = ref('objectDefinitionSource')
userDetailsService = ref('userDetailsService')
userCache = ref('userCache')
}
关于spring - Grails 插件 bean 的重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132679/