成功登录到不同页面后,如何根据用户之前的页面将用户重定向?
How can I redirect a user after successful login to different pages, based on their previous page?
我将用户重定向到主页,"Default target-url" 设置为“/”。但是,如果用户在产品页面 (/p/) 或搜索页面 (/search) 上登录,我需要重定向他们。我该怎么做呢?我对 Spring 安全和重定向还不是很了解。
我尝试在我的 AuthenticationSuccessHandler 的 onAuthenticationSuccess() 方法中拦截请求,并检查 URL 是否包含产品页面或搜索页面 url。
在 AuthenticationSuccessHandler 中:
if (!response.isCommitted()) {
super.onAuthenticationSuccess(request,response,authentication);
}
在 spring-安全-config.xml:
<bean id="authenticationSuccessHandler" class ="com.storefront.AuthenticationSuccessHandler" scope="tenant">
<property name="rememberMeCookieStrategy" ref="rememberMeCookieStrategy" />
<property name="customerFacade" ref="customerFacade" />
<property name="sCustomerFacade" ref="sCustomerFacade" />
<property name="sProductFacade" ref="sProductFacade" />
<property name="defaultTargetUrl" value="/" />
<property name="useReferer" value="true" />
<property name="requestCache" value="httpSessionRequestCache" />
预期结果将是:
- 当用户登录产品页面时,他们将返回到他们所在的产品页面。
- 当用户登录搜索页面时,他们将返回到他们所在的搜索页面。
- 如果用户登录时不在产品或搜索页面上,他们将被重定向到主页。
您可以针对 运行 您自己的方案扩展 AbstractLoginPageController。将 doLogin 方法中的 referrer URL 保存到 httpSessionRequestCache。然后在 getSuccessRedirect 方法中检查并过滤 return referrer URL。
Hybris OOTB(我指的是 V6.7)具有一项功能,您可以在其中列出要重定向到默认目标的 URL Url。这里的想法是使用仅允许给定 URL 并将所有其他 URL 重定向到默认目标 URL 的反向逻辑来创建另一个列表(或替换现有列表)。
在 OOTB 中,您可以在 spring-security-config.xml
中看到 listRedirectUrlsForceDefaultTarget,其中可以定义要重定向到默认的 URL 列表目标。如下所示。
<alias name="defaultLoginAuthenticationSuccessHandler" alias="loginAuthenticationSuccessHandler"/>
<bean id="defaultLoginAuthenticationSuccessHandler" class="de.hybris.platform.acceleratorstorefrontcommons.security.StorefrontAuthenticationSuccessHandler" >
<property name="customerFacade" ref="customerFacade" />
<property name="defaultTargetUrl" value="#{'responsive' == '${commerceservices.default.desktop.ui.experience}' ? '/' : '/my-account'}"/>
<property name="useReferer" value="true"/>
<property name="requestCache" ref="httpSessionRequestCache" />
<property name="uiExperienceService" ref="uiExperienceService"/>
<property name="cartFacade" ref="cartFacade"/>
<property name="customerConsentDataStrategy" ref="customerConsentDataStrategy"/>
<property name="cartRestorationStrategy" ref="cartRestorationStrategy"/>
<property name="forceDefaultTargetForUiExperienceLevel">
<map key-type="de.hybris.platform.commerceservices.enums.UiExperienceLevel" value-type="java.lang.Boolean">
<entry key="DESKTOP" value="false"/>
<entry key="MOBILE" value="false"/>
</map>
</property>
<property name="bruteForceAttackCounter" ref="bruteForceAttackCounter" />
<property name="restrictedPages">
<list>
<value>/login</value>
</list>
</property>
<property name="listRedirectUrlsForceDefaultTarget">
<list>/example/redirect/todefault</list>
</property>
</bean>
StorefrontAuthenticationSuccessHandler
@Override
public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response,
final Authentication authentication) throws IOException, ServletException
{
//...
//if redirected from some specific url, need to remove the cachedRequest to force use defaultTargetUrl
final RequestCache requestCache = new HttpSessionRequestCache();
final SavedRequest savedRequest = requestCache.getRequest(request, response);
if (savedRequest != null)
{
for (final String redirectUrlForceDefaultTarget : getListRedirectUrlsForceDefaultTarget())
{
if (savedRequest.getRedirectUrl().contains(redirectUrlForceDefaultTarget))
{
requestCache.removeRequest(request, response);
break;
}
}
}
//...
}
现在通过在 spring-security-config.xml
中声明新列表(假设 listAllowedRedirectUrls )或将 listRedirectUrlsForceDefaultTarget 替换为 listAllowedRedirectUrls 来反转该逻辑并执行SuccessHandler 中的相应更改。喜欢
<property name="listAllowedRedirectUrls">
<list>/p/</list>
<list>/search</list>
</property>
StorefrontAuthenticationSuccessHandler
if (savedRequest != null)
{
for (final String listAllowedRedirectUrl : getListAllowedRedirectUrls())
{
if ( ! savedRequest.getRedirectUrl().contains(listAllowedRedirectUrl))
{
requestCache.removeRequest(request, response);
break;
}
}
}
您还必须对 /login/checkout 处理程序声明 (defaultLoginCheckoutAuthenticationSuccessHandler
) 进行相同的更改。
我将用户重定向到主页,"Default target-url" 设置为“/”。但是,如果用户在产品页面 (/p/) 或搜索页面 (/search) 上登录,我需要重定向他们。我该怎么做呢?我对 Spring 安全和重定向还不是很了解。
我尝试在我的 AuthenticationSuccessHandler 的 onAuthenticationSuccess() 方法中拦截请求,并检查 URL 是否包含产品页面或搜索页面 url。
在 AuthenticationSuccessHandler 中:
if (!response.isCommitted()) {
super.onAuthenticationSuccess(request,response,authentication);
}
在 spring-安全-config.xml:
<bean id="authenticationSuccessHandler" class ="com.storefront.AuthenticationSuccessHandler" scope="tenant">
<property name="rememberMeCookieStrategy" ref="rememberMeCookieStrategy" />
<property name="customerFacade" ref="customerFacade" />
<property name="sCustomerFacade" ref="sCustomerFacade" />
<property name="sProductFacade" ref="sProductFacade" />
<property name="defaultTargetUrl" value="/" />
<property name="useReferer" value="true" />
<property name="requestCache" value="httpSessionRequestCache" />
预期结果将是:
- 当用户登录产品页面时,他们将返回到他们所在的产品页面。
- 当用户登录搜索页面时,他们将返回到他们所在的搜索页面。
- 如果用户登录时不在产品或搜索页面上,他们将被重定向到主页。
您可以针对 运行 您自己的方案扩展 AbstractLoginPageController。将 doLogin 方法中的 referrer URL 保存到 httpSessionRequestCache。然后在 getSuccessRedirect 方法中检查并过滤 return referrer URL。
Hybris OOTB(我指的是 V6.7)具有一项功能,您可以在其中列出要重定向到默认目标的 URL Url。这里的想法是使用仅允许给定 URL 并将所有其他 URL 重定向到默认目标 URL 的反向逻辑来创建另一个列表(或替换现有列表)。
在 OOTB 中,您可以在 spring-security-config.xml
中看到 listRedirectUrlsForceDefaultTarget,其中可以定义要重定向到默认的 URL 列表目标。如下所示。
<alias name="defaultLoginAuthenticationSuccessHandler" alias="loginAuthenticationSuccessHandler"/>
<bean id="defaultLoginAuthenticationSuccessHandler" class="de.hybris.platform.acceleratorstorefrontcommons.security.StorefrontAuthenticationSuccessHandler" >
<property name="customerFacade" ref="customerFacade" />
<property name="defaultTargetUrl" value="#{'responsive' == '${commerceservices.default.desktop.ui.experience}' ? '/' : '/my-account'}"/>
<property name="useReferer" value="true"/>
<property name="requestCache" ref="httpSessionRequestCache" />
<property name="uiExperienceService" ref="uiExperienceService"/>
<property name="cartFacade" ref="cartFacade"/>
<property name="customerConsentDataStrategy" ref="customerConsentDataStrategy"/>
<property name="cartRestorationStrategy" ref="cartRestorationStrategy"/>
<property name="forceDefaultTargetForUiExperienceLevel">
<map key-type="de.hybris.platform.commerceservices.enums.UiExperienceLevel" value-type="java.lang.Boolean">
<entry key="DESKTOP" value="false"/>
<entry key="MOBILE" value="false"/>
</map>
</property>
<property name="bruteForceAttackCounter" ref="bruteForceAttackCounter" />
<property name="restrictedPages">
<list>
<value>/login</value>
</list>
</property>
<property name="listRedirectUrlsForceDefaultTarget">
<list>/example/redirect/todefault</list>
</property>
</bean>
StorefrontAuthenticationSuccessHandler
@Override
public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response,
final Authentication authentication) throws IOException, ServletException
{
//...
//if redirected from some specific url, need to remove the cachedRequest to force use defaultTargetUrl
final RequestCache requestCache = new HttpSessionRequestCache();
final SavedRequest savedRequest = requestCache.getRequest(request, response);
if (savedRequest != null)
{
for (final String redirectUrlForceDefaultTarget : getListRedirectUrlsForceDefaultTarget())
{
if (savedRequest.getRedirectUrl().contains(redirectUrlForceDefaultTarget))
{
requestCache.removeRequest(request, response);
break;
}
}
}
//...
}
现在通过在 spring-security-config.xml
中声明新列表(假设 listAllowedRedirectUrls )或将 listRedirectUrlsForceDefaultTarget 替换为 listAllowedRedirectUrls 来反转该逻辑并执行SuccessHandler 中的相应更改。喜欢
<property name="listAllowedRedirectUrls">
<list>/p/</list>
<list>/search</list>
</property>
StorefrontAuthenticationSuccessHandler
if (savedRequest != null)
{
for (final String listAllowedRedirectUrl : getListAllowedRedirectUrls())
{
if ( ! savedRequest.getRedirectUrl().contains(listAllowedRedirectUrl))
{
requestCache.removeRequest(request, response);
break;
}
}
}
您还必须对 /login/checkout 处理程序声明 (defaultLoginCheckoutAuthenticationSuccessHandler
) 进行相同的更改。