2011-08-15 18 views
6

¿Cómo puedo configurar una aplicación Grails usando seguridad Spring de modo que un conjunto de URL redirigirá a usuarios no autenticados a un formulario de inicio de sesión personalizado con un código de respuesta http de 200, mientras que otro conjunto de URL está implementando servicios web relajantes y debe devolver un 401/no respuesta autorizada para clientes no autenticados para que la aplicación cliente pueda reenviar la solicitud con un nombre de usuario y contraseña en respuesta al 401.¿Cómo se configura el esquema de autentificación Grails/Spring por url?

Mi configuración actual puede manejar el primer caso con el formulario de inicio de sesión personalizado. Sin embargo, necesito configurar el otro tipo de autenticación para las url de la interfaz de descanso mientras se preserva el comportamiento actual de la interfaz humana.

Gracias!

Respuesta

0

Tuve el mismo problema y no encontré una buena solución para esto. Realmente estoy esperando una solución limpia (algo en el contexto como multi-inquilino).

Terminé verificando manualmente el estado y la parte de inicio de sesión para el segundo sistema, que no debería redireccionar a la página de inicio de sesión (entonces no estoy usando la anotación "Secured"). Lo hice usando springSecurityService.reauthenticate() (para iniciar sesión manualmente), springSecurityService.isLoggedIn() y manualmente en cada controlador para el segundo sistema. Si no fue así, he estado redireccionando a la página específica.

No sé si este método alternativo es asequible para su segundo sistema.

7

Si entendí bien lo que quiere hacer, ¡tuve el mismo problema antes! ¡pero es fácil resolverlo usando Spring Security grails Plugin! Así, en primer lugar, usted tiene que configurar la aplicación para utilizar la autenticación básica:

grails.plugins.springsecurity.useBasicAuth = true 

así que sus servicios de descanso a tratar de iniciar sesión, y si no funciona se va a 401! Esto es fácil pero también necesita usar un formulario personalizado para iniciar sesión ¿no? Lo que sólo puede config alguna URL para mete en su estrategia de inicio de sesión normal de la siguiente manera:

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

así que la atención, que por encima, todo lo que viene a la URL/api/utilizará la autenticación básica, pero nada que no sea ¡desde/api/usa el formulario de inicio de sesión de autenticación normal!

EDITAR

Más información va a http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

+0

Además, tenga cuidado de no ser mordido por este error, para que no pierda horas tratando de averiguar por qué esto no funciona para usted: http://jira.grails.org/browse/GPSPRINGSECURITYCORE-210 – James

0

Usted debe hacer la autenticación básica sin estado. Para eso, haga los siguientes cambios en su código.
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.maravilloso

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) 
    } 
} 
Cuestiones relacionadas