Безопасность Spring Boot перенаправляет пользователя на домашнюю страницу после успешного входа в систему вместо страницы до запроса страницы входа - PullRequest
0 голосов
/ 18 июня 2019

Это моя конфигурация безопасности в весенней загрузке:

http.authorizeRequests().antMatchers("/secured/**").hasAuthority("USER").antMatchers("/", "/**").permitAll();
http.formLogin().loginPage("/login").failureUrl("/login-error").and().logout().logoutUrl("/logout").logoutSuccessUrl("/");
http.httpBasic();

Независимо от того, откуда я вхожу, пользователь снова направляется на домашнюю страницу "/" вместо страницы, запрошенной перед входом в систему.

Например, http://localhost:8080/products?type-name=... не защищен, и любой может его просмотреть.Однако, если пользователь пытается войти с этой страницы, он перенаправляется на домашнюю страницу, а не остается на http://localhost:8080/products?type-name=... после входа в систему. Как я могу настроить безопасность, чтобы предотвратить это?

Даже при входе из /secured/.. URL, пользователь перенаправляется на домашнюю страницу.

Я заметил, что когда моя пользовательская страница входа возвращается через метод get:

@RequestMapping(path = "/login", method = RequestMethod.GET)
    public String loginGetHandler(HttpServletRequest req) {
        System.out.println("Referer: " + req.getHeader("referer")); 
        return "login";
    }

referer - это ожидаемый URL, на который нужно перенаправить пользователя.

Но после отправки формы входа реферер изменяется с ожидаемого URL-адреса на "http://localhost:8080/login".Поэтому, когда я внедряю обработчик success для перенаправления на URL-адрес referer, пользователь перенаправляется на страницу входа снова, несмотря на успешный вход в систему.

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

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Я обошел эту проблему, получив URL реферера в методе моей страницы входа, добавив его в атрибут модели и отправив URL-адрес в качестве скрытого поля формы для URL-адреса входа, откуда я мог получить URL-адрес в качестве параметра запроса в successhandler боб, как это:

@RequestMapping(path = "/login", method = RequestMethod.GET)
public String loginGetHandler(HttpServletRequest req,Model model) {
    System.out.println("Referer: " + req.getHeader("referer"));
    model.addAttribute("referer",req.getHeader("referer")); 
    return "login";
}

Передавая реферер как скрытое поле формы в URL-адрес входа, я могу получить этот URL-адрес обратно в компоненте AuthenticationSuccessHandler и перенаправить ответ.

@Bean
    public AuthenticationSuccessHandler successHandler() {
        return (HttpServletRequest request, HttpServletResponse response, Authentication authentication) -> {
            String parameter = request.getParameter("referer");
            System.out.println("redirect url: " + parameter);
            response.sendRedirect(parameter);
        };
    }

Это жизнеспособный вариант или есть какие-то риски в этом подходе?

0 голосов
/ 18 июня 2019

Вы можете использовать SavedRequest из Spring

Исходный запрос представлен объектом DefaultSavedRequest, к которому можно обратиться как атрибут сеанса с именем SPRING_SECURITY_SAVED_REQUEST.

https://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/savedrequest/SavedRequest.html

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