弹簧安全 - 在重定向到登录时保留URL参数

2022-09-01 23:41:11

还行。

假设我有一个安全的网址模式

/secure/link-profile

(可选)可以附加 url 参数。

/secure/link-profile?firstName=Bob&secondName=Smith&membershipNumber=1234

我怎样才能使这些网址参数被带到登录页面?

/login?firstName=Bob&secondName=Smith&membershipNumber=1234

基本前提是我们提供与第三方的奖励集成,第三方会将其用户发送给我们。他们将被带到一个页面,以将其第三方帐户/个人资料与他们/我们的网站用户相关联。但是,如果他们没有现有的帐户,那么在登录页面上,他们将转到注册页面,然后我们想预先填充第三方传递给我们的一些详细信息。

提前致谢

弹簧安全 2.0.7.发布弹簧框架 3.1.1.发布


答案 1

请参阅中的方法。buildRedirectUrlToLoginPage(HttpServletRequest request, ...)LoginUrlAuthenticationEntryPoint

如果我正确地理解了你想要实现的目标,我认为在subl类中重写此方法就足够了,复制原始方法,但在构建url时还要调用。 urlBuilder.setQuery(request.getQueryString())

然后,只需使用此自定义入口点配置 。ExceptionTranslationFilter


答案 2

根据@zagyi的回应,我只是在我现有的扩展中覆盖了一个方法AuthenticationProcessingFilterEntryPoint

要重写的方法由protected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)buildRedirectUrlToLoginPage(..

@Override
protected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException exception) {
    String url = super.determineUrlToUseForThisRequest(request, response, exception);
    return url + "?" + request.getQueryString();
}

显然,这可以改进为也使用某种构建器,迎合URL上现有的查询字符串,但此时我知道我的登录URL始终是,所以这对于我的目的来说很好/login/


推荐