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类型的spring bean
所以,我转向代表团:
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的依赖项.是否有一种更简单的方法来覆盖插件在受依赖注入影响的上下文中提供的方法?
解决方法:
返回在resources.groovy中继承和重新定义bean,但满足依赖性.它们是按名称自动注入的,但都是列出的,因此请将它们明确添加到重新定义中:
springSecurityService(CustomSpringSecurityService) {
authenticationTrustResolver = ref('authenticationTrustResolver')
grailsApplication = ref('grailsApplication')
passwordEncoder = ref('passwordEncoder')
objectDefinitionSource = ref('objectDefinitionSource')
userDetailsService = ref('userDetailsService')
userCache = ref('userCache')
}