2011-08-15 11 views
6

Jak mogę skonfigurować aplikację grails używając Spring Security tak, aby jeden zestaw adresów URL przekierował nieuwierzytelnionych użytkowników do niestandardowego formularza logowania z kodem odpowiedzi http równym 200, podczas gdy inny zestaw adresów URL implementuje restful web services i musi zwrócić 401/nieautoryzowana odpowiedź dla nieuwierzytelnionych klientów, aby aplikacja kliencka mogła ponownie wysłać żądanie przy użyciu nazwy użytkownika i hasła w odpowiedzi na 401.Jak skonfigurować schemat uwierzytelniania Grails/Spring na adres URL?

Moja obecna konfiguracja może obsłużyć pierwszy przypadek za pomocą niestandardowego formularza logowania. Muszę jednak skonfigurować inny typ uwierzytelniania dla realnych adresów URL interfejsu, zachowując bieżące zachowanie dla interfejsu użytkownika.

Dzięki!

Odpowiedz

0

Miałem ten sam problem i nie znalazłem dobrego rozwiązania. Naprawdę nie mogę się doczekać czystego rozwiązania (coś w takim kontekście jak multi-najemca).

Skończyłem ręcznie sprawdzając status i login-część dla drugiego systemu, który nie powinien przekierowywać na stronę logowania (nie używam adnotacji "Zabezpieczony"). Zrobiłem to za pomocą springSecurityService.reauthenticate() (do ręcznego logowania), springSecurityService.isLoggedIn() i ręcznie w każdym kontrolerze dla drugiego systemu. Jeśli nie, to przekierowuję do konkretnej strony.

Nie wiem, czy to obejście jest dostępne dla twojego drugiego systemu.

7

Jeśli dobrze zrozumiałem, co chcesz zrobić, wcześniej miałem ten sam problem! ale łatwo jest go rozwiązać za pomocą Spring Security grails Plugin! Tak więc, przede wszystkim, trzeba ustawić aplikację, aby używać podstawowego uwierzytelniania:

grails.plugins.springsecurity.useBasicAuth = true 

więc spokojny usługi postara się zalogować, a jeśli nie robi praca idzie do 401! To proste, ale aby zarejestrować się poprawnie, musisz użyć niestandardowego formularza ?! Więc może po prostu config jakiś adres na dostanie się do normalnej strategii logowania jak poniżej:

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

więc zauważył, że powyżej, wszystko, co przychodzi do adresu URL/API/użyje Basic Auth, ale wszystko, co nie jest from/api/używa zwykłego formularza logowania do uwierzytelniania!

EDIT

Więcej informacji trafia do http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

+0

Należy także uważać, aby nie gryzą tego błędu, żeby tracić godziny próbuje dowiedzieć się, dlaczego to nie działa dla Ciebie: http://jira.grails.org/browse/GPSPRINGSECURITYCORE-210 – James

0

Należy dokonać bezstanową uwierzytelniania podstawowego. W tym celu proszę wprowadzić następujące zmiany w kodzie.
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) 
    } 
}