Как зарегистрировать spring bean в grails, которому нужна ссылка на фильтр bean

Я пытаюсь использовать spring security oauth (плагин библиотеки не grails, есть только очень устаревший плагин grails).

Я хочу, чтобы мое приложение было провайдером OAuth 1.0a (а не OAuth 2). У части OAuth2 spring -security-oauth, похоже, нет этой проблемы, поскольку она не требует ссылки на filterchain в конфигурации поставщика.

Я хочу настроить его, как показано здесь: https://github.com/spring-projects/spring-security-oauth/blob/master/samples/oauth/sparklr/src/main/webapp/WEB-INF/applicationContext.xml

Я перевел это в синтаксис groovy grails:

consumerDetails(InMemoryConsumerDetailsService)
tokenServices(InMemoryProviderTokenServices)

xmlns oauth: "http://www.springframework.org/schema/security/oauth"
oauth.'consumer-details-service'(id:'consumerDetails') {
    oauth.consumer(name: 'AndroidRegisterApp', key:'testkey', secret:"testkey123", resourceName:'mobileApi', resourceDescription:'Register devices via mobile app')
}

oauth.provider(
        'consumer-details-service-ref': "consumerDetails",
        'token-services-ref':'tokenServices',
        'request-token-url':'/oauth/request_token',
        'authenticate-token-url':'/oauth/authorize',
        'access-granted-url':'/requestTokenAuthorized',
        'access-token-url':'/oauth/access_token',
        'filter-chain-ref':'springSecurityFilterChainProxy',
        'require10a':'true'
)

Проблема заключается в том, что когда OAuthProviderBeanDefinitionParser анализирует эту конфигурацию во время запуска приложения grails, SpringSecurityFilterChainProxy еще не существует, поэтому он терпит неудачу: https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth/src/main/java/org/springframework/security/oauth/config/OAuthProviderBeanDefinitionParser.java#L179 при вызове ConfigUtils.findFilterChain важная строка:

parserContext.getRegistry().getBeanDefinition(filterChainRef)

который терпит неудачу, потому что "springSecurityFilterChainProxy" просто не существует в parserContext (я думаю, потому что он создается только позже). Я также попытался отложить эту инициализацию, поставив ее в код начальной загрузки следующим образом:

def initOauthProvider() {
    def bb = new BeanBuilder(grailsApplication.getMainContext())
    bb.beans {
                   // same bean initialization code as above
            }
     }

это также терпит неудачу, потому что здесь у меня есть только beans в parserContext, которые являются частью моего определения (он не видит никаких других grails beans)

Есть ли способ исправить это? Я видел, что BeanBuilder также можно инициализировать с помощью объекта RuntimeSpringConfiguration, но я не нашел способа получить это от своего grails.

Я использую:

  • Grails 2.2.4
  • spring -security-oauth: 1.0.5 с этими исключениями: 'spring -security-web', 'spring -security-core', 'spring -asm'
  • spring -security-core: плагин 2.0-RC2 grails

Ответы

Ответ 1

Вы можете явно определить все зависимости spring bean (ссылки) в файле grails-app/conf/spring/resources.groovy.

Вот пример синтаксиса:

// resources.groovy
beans = { 

    yourBean(com.company.YourBean) {
        springSecurityService = ref('springSecurityService')
        otherService = ref('otherService')
        anotherService = ref('anotherService')
    }

}

Итак, в этом случае вы должны получить все три SpringSecurityService, otherService и anotherService, инициализированные и доступные изнутри yourBean bean.

Ответ 2

добавьте существующий xml файл в папку ресурса и используйте ниже

beans = {
   importBeans('classpath:/applicationContext-services.xml')
}