覆盖Grails插件bean的方法

Dón*_*nal 3 grails groovy spring spring-security

Spring Security插件提供了一个名为'springSecurityService'的bean grails.plugins.springsecurity.SpringSecurityService.我需要覆盖getCurrentUser此服务的方法.

我首先尝试使用扩展程序

class CustomSecurityService extends SpringSecurityService {

    @Override
    Object getCurrentUser() {
        // my implementation uses methods from the parent class
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用上面类的实例替换插件定义的bean,我将以下内容添加到 resources.groovy

springSecurityService(CustomSpringSecurityService)
Run Code Online (Sandbox Code Playgroud)

但这没有用,因为没有设置SpringSecurityService(我正在扩展的类)的依赖项,所以我得到了NullPointerExceptions.这些依赖关系未设置的原因是因为不再有类型的spring beanSpringSecurityService

所以,我转向代表团:

import grails.plugins.springsecurity.SpringSecurityService as PluginSpringSecurityService

class CustomSpringSecurityService {

    @Autowired @Delegate
    PluginSpringSecurityService pluginSpringSecurityService

    Object getCurrentUser() {
        // my implementation uses methods from pluginSpringSecurityService
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我定义了两个bean resources.groovy

springSecurityService(CustomSpringSecurityService)
pluginSpringSecurityService(grails.plugins.springsecurity.SpringSecurityService)
Run Code Online (Sandbox Code Playgroud)

在第二次尝试中,我再次想要名为'springSecurityService'的bean来引用CustomSpringSecurityService,但我还需要一个类型的bean grails.plugins.springsecurity.SpringSecurityService,因为我实现了getCurrentUser使用该bean的其他一些方法.

但是,我再次发现pluginSpringSecurityService没有设置依赖关系.是否有一种更简单的方法来覆盖插件在受依赖注入影响的上下文中提供的方法?

Bur*_*ith 5

返回子类化并重新定义bean resources.groovy,但满足依赖性.它们是按名称自动注入的,但都是列出的,因此请将它们明确添加到重新定义中:

springSecurityService(CustomSpringSecurityService) {
   authenticationTrustResolver = ref('authenticationTrustResolver')
   grailsApplication = ref('grailsApplication')
   passwordEncoder = ref('passwordEncoder')
   objectDefinitionSource = ref('objectDefinitionSource')
   userDetailsService = ref('userDetailsService')
   userCache = ref('userCache')
}
Run Code Online (Sandbox Code Playgroud)