2013-10-29 14 views
14

Sto provando a usare spring security oauth (plugin di library not grails, c'è solo un plugin Grails estremamente obsoleto).Come registrare il bean spring in grails che necessita di un riferimento a un filtro bean

Desidero che la mia app sia un provider OAuth 1.0a (non OAuth 2). La parte di OAuth2 di spring-security-oauth non sembra avere questo problema, perché non richiede un riferimento alla filterchain nella configurazione del provider.

Quello che voglio è quello di configurarlo come illustrato di seguito: https://github.com/spring-projects/spring-security-oauth/blob/master/samples/oauth/sparklr/src/main/webapp/WEB-INF/applicationContext.xml

Ho tradotto questo per la sintassi Groovy del graal:

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

Il problema è che quando OAuthProviderBeanDefinitionParser analizza questa configurazione durante l'avvio graal app , springSecurityFilterChainProxy non esiste ancora, quindi non riesce qui: https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth/src/main/java/org/springframework/security/oauth/config/OAuthProviderBeanDefinitionParser.java#L179 mentre chiama ConfigUtils.findFilterChain la linea importante in c'è:

parserContext.getRegistry().getBeanDefinition(filterChainRef) 

che non riesce perché "springSecurityFilterChainProxy" non esiste nel parserContext (credo perché verrà creato solo in seguito). Ho anche cercato di rinviare questa inizializzazione, mettendolo nel codice di bootstrap come questo:

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

questo fallisce anche perché qui ho solo i fagioli nel parserContext che fanno parte della mia definizione (non vede altri chicchi di graal)

c'è un modo per risolvere il problema? Ho visto che il BeanBuilder può anche essere inizializzato con un oggetto RuntimeSpringConfiguration ma non ho trovato alcun modo su come ottenere questo dalla mia app Grails.

sto usando:

  • Grails 2.2.4
  • primavera-sicurezza-OAuth: 1.0.5 con queste esclude: 'spring-security-web', 'Spring-security-core', 'spring-asm'
  • primavera-sicurezza-core: graal 2.0-RC2 plug
+0

Avete controllato [questo] repo (https://github.com/danveloper/grails-oauth2)? –

+0

Ho visto esempi simili che (incluso il tuo link) utilizzano tutti il ​​provider oauth2 che non è quello di cui ho bisogno. La configurazione di OAuth2 sembra diversa (modificata e spiegata nella mia domanda), non sembrano aver bisogno di un riferimento alla security filterchain di primavera, si limitano a definire la propria filterchain.Non posso semplicemente omettere l'argomento "filter-chain-ref" poiché ricade semplicemente su un valore predefinito. – NoUsername

+0

Ma il repository mostra che puoi avere un file chiamato resources.xml invece di dichiarare i bean in modo Groovy, quindi puoi usare l'esempio xml. –

risposta

1

puoi provare a definire esplicitamente tutte le dipendenze primavera di fagioli (referenze) in Grails-app/conf/primavera/risorse .groovy file.

Ecco un sintassi di esempio:

// resources.groovy 
beans = { 

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

} 

Quindi, in questo caso, si dovrebbe ottenere tutti e tre springSecurityService, otherService e anotherService inizializzati e accessibile dall'interno del chicco yourBean.

0

aggiungere il file XML esistente nella cartella delle risorse e utilizzare il sotto

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