Как настроить схему аутентификации grails / spring для каждого URL? - PullRequest
7 голосов
/ 15 августа 2011

Как я могу настроить приложение grails, используя Spring Security, чтобы один набор URL-адресов перенаправлял неаутентифицированных пользователей в пользовательскую форму входа с кодом ответа http 200, тогда как другой набор URL-адресов реализует успокоительные веб-службы и должен возвращать 401 / не авторизованный ответ для неаутентифицированных клиентов, поэтому клиентское приложение может отправить запрос с именем пользователя и паролем в ответ на 401.

Моя текущая конфигурация может обрабатывать первый случай с помощью пользовательской формы входа. Однако мне нужно настроить другой тип аутентификации для URL-адресов остальных интерфейсов, сохраняя при этом текущее поведение человеческого интерфейса.

Спасибо!

Ответы [ 3 ]

8 голосов
/ 15 августа 2011

Если я правильно понял, что вы хотите сделать, у меня была такая же проблема, прежде!но это легко решить с помощью Spring Security grails Plugin !Итак, прежде всего, вы должны настроить ваше приложение на использование базовой аутентификации:

grails.plugins.springsecurity.useBasicAuth = true

Таким образом, ваши остальные службы будут пытаться войти в систему, и если она не работает, она переходит к 401!Это легко, но вам также нужно использовать пользовательскую форму для входа прямо ?!Таким образом, вы можете просто настроить некоторый URL-адрес, чтобы он входил в вашу обычную стратегию входа в систему следующим образом:

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

Итак, вы заметили, что выше, все, что приходит к URL / api /, будет использовать Basic Auth, но все, чтоне из / api / использует обычную форму авторизации для авторизации!

РЕДАКТИРОВАТЬ

Более подробная информация находится на http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/16%20Filters.html

0 голосов
/ 25 марта 2015

Вы должны выполнить базовую аутентификацию без сохранения состояния.Для этого внесите следующие изменения в свой код. 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)
     }
}
0 голосов
/ 15 августа 2011

У меня была такая же проблема, и я не нашел хорошего решения для этого. Я действительно с нетерпением жду чистого решения (что-то в контексте, как мультитенант).

В итоге я вручную проверил состояние и часть входа для второй системы, которая не должна перенаправляться на страницу входа (поэтому я не использую аннотацию «Защищено»). Я сделал это, используя springSecurityService.reauthenticate() (для входа в систему вручную), springSecurityService.isLoggedIn() и вручную в каждом контроллере для второй системы. Если он не был, я бы перенаправил на конкретную страницу.

Я не знаю, возможен ли этот обходной путь для вашей второй системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...