2013-10-29 5 views
14

Ich versuche, Frühling Sicherheit oauth (Bibliothek nicht Grails Plugin verwenden, gibt es nur eine extrem veraltete Grails-Plugin).Wie Spring Bean in Grals registrieren, die einen Verweis auf eine Filter Bean benötigt

Ich möchte, dass meine App ein OAuth 1.0a-Provider ist (nicht OAuth 2). Der OAuth2-Teil von spring-security-oauth scheint dieses Problem nicht zu haben, da in der Provider-Konfiguration kein Verweis auf die Filterkette benötigt wird.

Was ich will, ist es zu konfigurieren, wie hier gezeigt: https://github.com/spring-projects/spring-security-oauth/blob/master/samples/oauth/sparklr/src/main/webapp/WEB-INF/applicationContext.xml

ich dies auf die groovy Syntax von Grails übersetzt:

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' 
) 

Das Problem ist, dass, wenn OAuthProviderBeanDefinitionParser parst diese Konfiguration während Grails App Start , der springSecurityFilterChainProxy existiert noch nicht, so dass er hier fehlschlägt: https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth/src/main/java/org/springframework/security/oauth/config/OAuthProviderBeanDefinitionParser.java#L179 beim Aufruf von ConfigUtils.findFilterChain die wichtige Zeile dort ist:

parserContext.getRegistry().getBeanDefinition(filterChainRef) 

was fehlschlägt, da "springSecurityFilterChainProxy" im ParserContext nicht existiert (ich denke, weil es erst später erstellt wird). Ich habe auch versucht, diese Initialisierung zu verschieben, indem sie sie in den Bootstrap-Code wie folgt setzen:

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

dies nicht gelingt auch, weil ich hier nur die Bohnen in der ParserContext haben, die Teil meiner Definition sind (es nicht sehen irgendwelche anderen Grails Bohnen)

gibt es eine Möglichkeit, dass ich das beheben kann? Ich habe gesehen, dass die BeanBuilder kann auch mit einem RuntimeSpringConfiguration-Objekt initialisiert werden, aber ich habe keine Möglichkeit gefunden, wie Sie dies von meinem Grails App erhalten.

Ich verwende:

  • Grails 2.2.4
  • federsicherheits oauth: 1.0.5 mit diesen umfasst nicht: 'federsicherheits web', 'Frühling-security-Kern', 'feder asm'
  • Feder-security-Kern: 2.0-RC2 Grails Plugin
+0

Haben Sie überprüft [diese] (https://github.com/danveloper/grails-oauth2) Repo verwenden? –

+0

Ich habe ähnliche Beispiele angeschaut, die (einschließlich Ihres Links) alle den oauth2-Provider benutzen, was ich nicht brauche. Die OAuth2-Konfiguration sieht anders aus (in meiner Frage bearbeitet und erklärt), sie scheinen keinen Verweis auf die Spring-Security-Filterkette zu benötigen, sie definieren nur ihre eigene Filterkette.Ich kann das Argument "filter-chain-ref" nicht einfach weglassen, da es einfach auf einen Standard zurückgreift. – NoUsername

+0

Aber das Repository zeigt Ihnen, dass Sie eine Datei namens resources.xml haben können, anstatt die Beans auf die Groovy-Art zu deklarieren, so dass Sie das XML-Beispiel verwenden können. –

Antwort

1

Sie können versuchen, explizit die Feder alle bean Abhängigkeiten zu definieren (Referenzen) in Grails-app/conf/Frühjahr/Ressourcen .groovy Datei.

Hier ist ein Beispiel Syntax:

// resources.groovy 
beans = { 

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

} 

in diesem Fall also sollten Sie alle drei springSecurityService erhalten, otherService und anotherService initialisiert und von innerhalb der yourBean Bohne.

0

Ihre vorhandene XML-Datei in Ressource-Ordner hinzufügen und die unten

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