Spring Security SAML SSO перенаправить на контроллер - PullRequest
0 голосов
/ 29 ноября 2018

Использование фрагмента кода для перенаправления на контроллер (/ bootstrap / v1) в настройках, инициированных IdP:

public SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler() {
    SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successRedirectHandler.setDefaultTargetUrl("/bootstrap/v1");
    return successRedirectHandler;
}

Фрагмент кода контроллера:

public class BootstrapController extends ParentController {

    @RequestMapping(value = "/v1", method = RequestMethod.POST)
    public ResponseEntity<BootstrapResponseDto> bootstrap(@RequestBody BootstrapRequestDto bootstrapRequestDto, @RequestHeader(value = "MAC-ADDRESS", required = false) String macAddress) {

        myAppUserDetails userDetails = SecurityContextUtils.getUserDetails();

        BootstrapResponseDto bootstrapResponseDto = new BootstrapResponseDto();

        // some app specific logic goes here...

        return new ResponseEntity<>(bootstrapResponseDto, HttpStatus.OK);
    }
}

Журнал уровня отладкифрагмент:

29-29-2018 13:33:53 e7a5edb2-4051-4132-bad0-856d58af1c7d ZDJhMWExYWUtZTAxNy00NDQwLWJmOTctNzcyNTJlOWUyNmQ2 INFO http-nug-80 * 1-я весна-2010*

Запрос получен для POST '/ saml / SSO':

org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper@28cc5b21

servletPath: / saml / SSO путьпустые заголовки: host: localhost: 8080 пользовательский агент: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10.13; rv: 63.0) Gecko / 20100101 Firefox / 63.0 принимает: текст / html, application / xhtml + xml, application / xml;q = 0,9, / ; q = 0,8 принимающий язык: en-US, en; q = 0,5 принимаемый кодировка: gzip, тип содержимого deflate: application / x-www-form-urlencoded content-длина: 11320 dnt: 1 соединение: keep-alive cookie: JSESSIONID = ZDJhMWExYWUtZTAxNy00NDQwLWJmOTctNzcyNTJlOWUyNmQ2 обновить-небезопасные-запросов: 1

Security фильтр цепи: [MetadataGeneratorFilter
WebAsyncManagerIntegrationFilter SecurityContextPersistenceFilter
CustomLogFilter HeaderWriterFilter LogoutFilter
UsernamePasswordAuthenticationFilter BasicAuthenticationFilter
FilterChainProxy RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter
AnonymousAuthenticationFilter SessionManagementFilter
ExceptionTranslationFilter FilterSecurityInterceptor]


29-29-2018 13:33:53 e7a5edb2-4051-4132-bad0-856d58af1c7d INFO http-nio-8080-exec-6 oocbsSAMLPПротокол протокола сообщенияXMLПрименениеПодпискаПодписьПодписьПодпискаПодпискаПодтверждениеПодтверждениеПодтверждениеПодтверждениеSignatureSignuподпись выполнена успешно, тип сообщения: {urn: oasis: names: tc: SAML: 2.0: протокол} Ответ 11-29-2018 13:33:53 e7a5edb2-4051-4132-bad0-856d58af1c7d ZDJhMWExYWUtZTAxNy00NDQwLWJmOTctNzcyNTQ0-INFO-80-INFO-7 Spring Security Debugger:


Запрос получен для GET'/ bootstrap / v1':

org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper@5f9e2aff

servletPath: / bootstrap / v1 pathInfo: null заголовки: хост: хостпользовательский агент: Mozilla / 5.0 (Macintosh;Intel Mac OS X 10.13;rv: 63.0) Gecko / 20100101 Firefox / 63.0 принимает: текст / html, application / xhtml + xml, application / xml; q = 0,9, / ; q = 0,8 принимающий язык: en-US, en; q = 0.5 accept-encoding: gzip, deflate dnt: 1 соединение: cookie-файл keep-alive: JSESSIONID = ZDJhMWExYWUtZTAxNy00NDQwLWJmOTctNzcyNTJlOWUyNmQ2 запросы на обновление-небезопасные запросы: 1

Filters2FilterFainter_Filter* CustomLogFilter HeaderWriterFilter LogoutFilter * * 1 044 UsernamePasswordAuthenticationFilter BasicAuthenticationFilter
FilterChainProxy RequestCacheAwareFilter
SecurityContextHolderAwareRequestFilter * * AnonymousAuthenticationFilter тысяча сорок семь SessionManagementFilter
ExceptionTranslationFilter FilterSecurityInterceptor]


11-29-2018 13:33:53 e7a5edb2-4051-4132-bad0-856d58af1c7d ПРЕДУПРЕЖДЕНИЕ http-nio-8080-exec-7 oswsPageNotFound: Метод запроса 'GET' не поддерживается

ExpiringUsernameAuthenticationToken установлен на retuрН:

org.springframework.security.providers.ExpiringUsernameAuthenticationToken@fee70636: Руководитель: ком.. .Security.authentication @ 325fcf8b;Полномочия: [ЗАЩИЩЕНО];Аутентифицировано: правда;Детали: ноль;Предоставленные полномочия: полномочия_1, полномочия_2, полномочия_3, полномочия_4

Итак, я предполагаю, что моя проверка подлинности SAML и проверка подлинности и авторизации пользователей - это хорошо.

Кажется, проблема в том, что HTTP GET не работает.

Как вместо этого настроить и отправить HTTP POST?или я должен реорганизовать свой контроллер для обработки поведения (которое может нарушить вход в систему на основе форм, что также является частью аутентификации приложения)?

HTTP-статус 405 - метод не разрешен Ошибка

1 Ответ

0 голосов
/ 01 декабря 2018

Я полагаю, что этот вопрос вовсе не связан с SAML, а является общим вопросом безопасности Spring.Кроме того, вы не указываете, откуда берется тело BootstrapRequestDto.

У вас есть SuccessHandler, который выполняет перенаправление:

successRedirectHandler.setDefaultTargetUrl("/bootstrap/v1"); Это выполняет GET

А у вас контроллер только принимает POST.И вы не указали, откуда это тело?

Вам нужно будет написать собственный обработчик успеха, который выдает сообщение (может быть, форму автоматической отправки javascript?), Или просто изменить свой контроллер, чтобы он также принимал GET.

public class BootstrapController extends ParentController {

    @RequestMapping(value = "/v1", method = RequestMethod.GET)
    public ResponseEntity<BootstrapResponseDto> bootstrap() {

        myAppUserDetails userDetails = SecurityContextUtils.getUserDetails();
        BootstrapResponseDto bootstrapResponseDto = new bootstrapResponseDto();

        // some app specific logic goes here...
        return new ResponseEntity<>(bootstrapResponseDto, HttpStatus.OK);
    }

    @RequestMapping(value = "/v1", method = RequestMethod.POST)
    public ResponseEntity<BootstrapResponseDto> bootstrap(@RequestBody BootstrapRequestDto bootstrapRequestDto, @RequestHeader(value = "MAC-ADDRESS", required = false) String macAddress) {

        myAppUserDetails userDetails = SecurityContextUtils.getUserDetails();

        BootstrapResponseDto bootstrapResponseDto = new BootstrapResponseDto();

        // some app specific logic goes here...

        return new ResponseEntity<>(bootstrapResponseDto, HttpStatus.OK);
    }
}
...