Spring Security插件提供了一个名为'springSecurityService'的bean,类型为grails.plugins.springsecurity.SpringSecurityService
。我需要覆盖此服务的getCurrentUser
方法。
我首先尝试使用扩展程序
class CustomSecurityService extends SpringSecurityService {
@Override
Object getCurrentUser() {
// my implementation uses methods from the parent class
}
}
要将插件定义的bean替换为上面类的实例,我将以下内容添加到resources.groovy
springSecurityService(CustomSpringSecurityService)
但这没有用,因为SpringSecurityService
(我正在扩展的类)的依赖关系都没有设置,所以我得到了NullPointerExceptions。这些依赖关系未设置的原因是因为不再存在SpringSecurityService
所以,我转向代表团:
import grails.plugins.springsecurity.SpringSecurityService as PluginSpringSecurityService
class CustomSpringSecurityService {
@Autowired @Delegate
PluginSpringSecurityService pluginSpringSecurityService
Object getCurrentUser() {
// my implementation uses methods from pluginSpringSecurityService
}
}
然后我在resources.groovy
springSecurityService(CustomSpringSecurityService)
pluginSpringSecurityService(grails.plugins.springsecurity.SpringSecurityService)
在第二次尝试中,我再次希望名为'springSecurityService'的bean引用CustomSpringSecurityService
,但我还需要一个grails.plugins.springsecurity.SpringSecurityService
类型的bean,因为我使用getCurrentUser
的实现该bean的其他一些方法。
但是,我再次发现pluginSpringSecurityService
的依赖关系未被设置。是否有一种更容易的方法来覆盖受依赖注入的上下文中插件提供的bean的方法?
答案 0 :(得分:5)
返回继承并重新定义resources.groovy
中的bean,但满足依赖关系。它们是按名称自动注入的,但都是列出的,因此请将它们明确添加到重新定义中:
springSecurityService(CustomSpringSecurityService) {
authenticationTrustResolver = ref('authenticationTrustResolver')
grailsApplication = ref('grailsApplication')
passwordEncoder = ref('passwordEncoder')
objectDefinitionSource = ref('objectDefinitionSource')
userDetailsService = ref('userDetailsService')
userCache = ref('userCache')
}