2011-08-15 15 views
6

Come configurare un'applicazione Grails utilizzando la sicurezza Spring in modo che un gruppo di URL reindirizzerà gli utenti non autenticati a un modulo di accesso personalizzato con un codice di risposta http di 200, mentre un altro gruppo di URL sta implementando servizi Web restful e deve restituire un 401/risposta non autorizzata per i client non autenticati in modo che l'applicazione client possa inviare nuovamente la richiesta con un nome utente e una password in risposta al 401.Come configurare lo schema di autenticazione grails/spring per url?

La mia configurazione corrente può gestire il primo caso con il modulo di accesso personalizzato. Tuttavia, ho bisogno di configurare l'altro tipo di autenticazione per l'url dell'interfaccia restful preservando il comportamento corrente per l'interfaccia umana.

Grazie!

risposta

0

Ho avuto lo stesso problema e non ho trovato una buona soluzione per questo. Sono davvero impaziente di trovare una soluzione pulita (qualcosa nel contesto come multi-tenant).

Ho finito per verificare manualmente lo stato e la parte di accesso per il secondo sistema, che non dovrebbe reindirizzare alla pagina di accesso (quindi non sto utilizzando l'annotazione "Protetto"). L'ho fatto usando springSecurityService.reauthenticate() (per l'accesso manuale), springSecurityService.isLoggedIn() e manualmente in ogni controller per il secondo sistema. Se non lo fosse, ho reindirizzato alla pagina specifica.

Non so, se questo work-around è conveniente per il tuo secondo sistema.

7

Se ho capito bene cosa vuoi fare, ho avuto lo stesso problema, prima! ma è facile risolverlo usando Spring Security grails Plugin! Quindi, prima di tutto, è necessario impostare l'applicazione per utilizzare l'autenticazione di base:

grails.plugins.springsecurity.useBasicAuth = true 

Così i vostri servizi riposanti cercherà di effettuare il login, e Se non funziona si va a 401! Questo è facile ma devi anche usare un modulo personalizzato per accedere correttamente ?! Quindi, si può solo config alcuni URL ottiene nella vostra strategia di accesso normale come questo:

grails.plugins.springsecurity.filterChain.chainMap = [ 
    '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter', 
    '/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter' 
] 

Così notare, che al di sopra, tutto ciò che viene all'URL/api/utilizzerà l'Auth di base, ma tutto ciò che non è da/api/usa il normale modulo di login per l'autenticazione!

EDIT

Maggiori informazioni va a http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

+0

Inoltre, fare attenzione a non farsi morso da questo bug, per timore di perdere ore a cercare di capire il motivo per cui questo non funziona per voi: http://jira.grails.org/browse/GPSPRINGSECURITYCORE-210 – James

0

Si dovrebbe fare l'autenticazione di base senza stato. Per questo si prega di apportare le seguenti modifiche nel codice.
UrlMappings.groovy

"/api/restLogin"(controller: 'api', action: 'restLogin', parseRequest: true) 

Config.groovy

grails.plugin.springsecurity.useBasicAuth = true 
grails.plugin.springsecurity.basic.realmName = "Login to My Site" 
    grails.plugin.springsecurity.filterChain.chainMap = [ 
       '*'   : 'statelessSecurityContextPersistenceFilter,logoutFilter,authenticationProcessingFilter,customBasicAuthenticationFilter,securityContextHolderAwareRequestFilter,rememberMeAuthenticationFilter,anonymousAuthenticationFilter,basicExceptionTranslationFilter,filterInvocationInterceptor', 
       '/api/': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter' 
     ] 

resources.groovy

statelessSecurityContextRepository(NullSecurityContextRepository) {} 

    statelessSecurityContextPersistenceFilter(SecurityContextPersistenceFilter, ref('statelessSecurityContextRepository')) { 
    } 
    customBasicAuthenticationEntryPoint(CustomBasicAuthenticationEntryPoint) { 
     realmName = SpringSecurityUtils.securityConfig.basic.realmName 
    } 

    customBasicAuthenticationFilter(BasicAuthenticationFilter, ref('authenticationManager'), ref('customBasicAuthenticationEntryPoint')) { 
     authenticationDetailsSource = ref('authenticationDetailsSource') 
     rememberMeServices = ref('rememberMeServices') 
     credentialsCharset = SpringSecurityUtils.securityConfig.basic.credentialsCharset // 'UTF-8' 
    } 

    basicAccessDeniedHandler(AccessDeniedHandlerImpl) 

    basicRequestCache(NullRequestCache) 

    basicExceptionTranslationFilter(ExceptionTranslationFilter, ref('customBasicAuthenticationEntryPoint'), ref('basicRequestCache')) { 
     accessDeniedHandler = ref('basicAccessDeniedHandler') 
     authenticationTrustResolver = ref('authenticationTrustResolver') 
     throwableAnalyzer = ref('throwableAnalyzer') 
    } 

CustomBasicAuthenticationEntryPoint.Groovy

public class CustomBasicAuthenticationEntryPoint extends 
     BasicAuthenticationEntryPoint { 

    @Override 
    public void commence(HttpServletRequest request, 
         HttpServletResponse response, AuthenticationException authException) 
      throws IOException, ServletException {    
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } 

} 

ApiController

@Secured('permitAll') 
class ApiController { 
def springSecurityService 
@Secured("ROLE_USER") 
    def restLogin() {   
     User currentUser = springSecurityService.currentUser 
     println(currentUser.username) 
    } 
} 
Problemi correlati