From fad2ca8be08098008e0a50746fa67c426b799813 Mon Sep 17 00:00:00 2001 From: Mauro Mugnaini Date: Wed, 1 Jul 2020 19:36:59 +0200 Subject: [PATCH] Implemented redirect to reqeusted URI (last path) after login --- .../oidc/lr62/OpenIdConnectLoginFilter.java | 31 +++++++++++++++++++ .../portal/oidc/lr62/PostLoginAction.java | 15 +++++++++ 2 files changed, 46 insertions(+) diff --git a/src/main/java/org/gcube/portal/oidc/lr62/OpenIdConnectLoginFilter.java b/src/main/java/org/gcube/portal/oidc/lr62/OpenIdConnectLoginFilter.java index 2dbe25a..03c16a1 100644 --- a/src/main/java/org/gcube/portal/oidc/lr62/OpenIdConnectLoginFilter.java +++ b/src/main/java/org/gcube/portal/oidc/lr62/OpenIdConnectLoginFilter.java @@ -22,6 +22,8 @@ public class OpenIdConnectLoginFilter extends BaseFilter { protected static final Log log = LogFactoryUtil.getLog(OpenIdConnectLoginFilter.class); + public static final String REDIRECT_ATTRIBUTE = "redirect-after-login-to"; + public OpenIdConnectLoginFilter() { super(); if (log.isDebugEnabled()) { @@ -62,6 +64,13 @@ public class OpenIdConnectLoginFilter extends BaseFilter { JWTTokenUtil.putOIDCInRequest(token, request); // The auto login class will perform the portal auto login using the token } else { + String redirect = getRedirect(request); + if (redirect != null) { + if (log.isDebugEnabled()) { + log.debug("Setting orginal reqeusted URI in session: " + redirect); + } + session.setAttribute(REDIRECT_ATTRIBUTE, redirect); + } String oidcRedirectURL = OpenIdConnectRESTHelper.buildLoginRequestURL( configuration.getAuthorizationURL(), request.getServerName(), sessionId, request.getRequestURL().toString()); @@ -73,9 +82,31 @@ public class OpenIdConnectLoginFilter extends BaseFilter { return; } } + processFilter(getClass(), request, response, filterChain); } + private String getRedirect(HttpServletRequest request) { + if (log.isTraceEnabled()) { + log.trace("Getting redirect parameter"); + } + String redirect = request.getParameter("redirect"); + if (redirect == null) { + if (log.isTraceEnabled()) { + log.trace("Redirect parameter is null, trying with p_p_id and related redirect parameter"); + } + String ppId = request.getParameter("p_p_id"); + if (ppId != null) { + String redirectParamName = "_" + ppId + "_"; + if (log.isTraceEnabled()) { + log.trace("Getting numbered redirect parameter: " + redirectParamName); + } + redirect = request.getParameter(redirectParamName); + } + } + return redirect; + } + @Override protected Log getLog() { return log; diff --git a/src/main/java/org/gcube/portal/oidc/lr62/PostLoginAction.java b/src/main/java/org/gcube/portal/oidc/lr62/PostLoginAction.java index 28dba41..55b324c 100644 --- a/src/main/java/org/gcube/portal/oidc/lr62/PostLoginAction.java +++ b/src/main/java/org/gcube/portal/oidc/lr62/PostLoginAction.java @@ -1,5 +1,8 @@ package org.gcube.portal.oidc.lr62; +import java.io.IOException; +import java.net.URLDecoder; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -37,6 +40,18 @@ public class PostLoginAction extends Action { log.info("Setting OIDC token in session"); JWTTokenUtil.putOIDCInSession(token, session); } + String redirect = (String) session.getAttribute(OpenIdConnectLoginFilter.REDIRECT_ATTRIBUTE); + if (redirect != null) { + session.removeAttribute(OpenIdConnectLoginFilter.REDIRECT_ATTRIBUTE); + if (log.isDebugEnabled()) { + log.debug("Redirecting to the original requested URI: " + redirect); + } + try { + response.sendRedirect(URLDecoder.decode(redirect, "UTF-8")); + } catch (IOException e) { + new ActionException("Redirecting to original requested URI", e); + } + } } }