diff --git a/source/java/org/alfresco/web/app/portlet/AlfrescoFacesPortlet.java b/source/java/org/alfresco/web/app/portlet/AlfrescoFacesPortlet.java index 10df8f9b77..0964370f69 100644 --- a/source/java/org/alfresco/web/app/portlet/AlfrescoFacesPortlet.java +++ b/source/java/org/alfresco/web/app/portlet/AlfrescoFacesPortlet.java @@ -40,6 +40,7 @@ import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.AuthenticationHelper; import org.alfresco.web.bean.ErrorBean; import org.alfresco.web.bean.FileUploadBean; +import org.alfresco.web.bean.LoginBean; import org.alfresco.web.bean.repository.User; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; @@ -59,6 +60,7 @@ import org.springframework.web.context.WebApplicationContext; */ public class AlfrescoFacesPortlet extends MyFacesGenericPortlet { + private static final String PREF_ALF_USERNAME = "_alfUserName"; public static final String INSTANCE_NAME = "AlfrescoClientInstance"; public static final String MANAGED_BEAN_PREFIX = "javax.portlet.p." + INSTANCE_NAME + "?"; @@ -146,7 +148,6 @@ public class AlfrescoFacesPortlet extends MyFacesGenericPortlet } else { - String viewId = request.getParameter(VIEW_ID); User user = (User)request.getPortletSession().getAttribute(AuthenticationHelper.AUTHENTICATION_USER); if (user != null) { @@ -158,6 +159,23 @@ public class AlfrescoFacesPortlet extends MyFacesGenericPortlet AuthenticationService auth = (AuthenticationService)ctx.getBean("authenticationService"); auth.validate(user.getTicket()); + // save last username into portlet preferences, get from LoginBean state + LoginBean loginBean = (LoginBean)request.getPortletSession().getAttribute(AuthenticationHelper.LOGIN_BEAN); + if (loginBean != null) + { + // + // TODO: Need to login to JBoss Portal to get a user here to store prefs against + // so not really a suitable solution as they get thrown away at present! + // Also would need to store prefs PER user - so auto login for each...? + // + String oldValue = request.getPreferences().getValue(PREF_ALF_USERNAME, null); + if (oldValue == null || oldValue.equals(loginBean.getUsernameInternal()) == false) + { + request.getPreferences().setValue(PREF_ALF_USERNAME, loginBean.getUsernameInternal()); + request.getPreferences().store(); + } + } + // do the normal JSF processing super.processAction(request, response); } @@ -226,6 +244,7 @@ public class AlfrescoFacesPortlet extends MyFacesGenericPortlet { // if we have no User object in the session then an HTTP Session timeout must have occured // use the viewId to check that we are not already on the login page + PortletSession session = request.getPortletSession(); String viewId = request.getParameter(VIEW_ID); User user = (User)request.getPortletSession().getAttribute(AuthenticationHelper.AUTHENTICATION_USER); if (user == null && (viewId == null || viewId.equals(getLoginPage()) == false)) @@ -233,6 +252,10 @@ public class AlfrescoFacesPortlet extends MyFacesGenericPortlet if (logger.isDebugEnabled()) logger.debug("No valid User login, requesting login page. ViewId: " + viewId); + // set last used username as special session value used by the LoginBean + session.setAttribute(AuthenticationHelper.SESSION_USERNAME, + request.getPreferences().getValue(PREF_ALF_USERNAME, null)); + // login page redirect response.setContentType("text/html"); request.getPortletSession().setAttribute(PortletUtil.PORTLET_REQUEST_FLAG, "true"); @@ -240,6 +263,13 @@ public class AlfrescoFacesPortlet extends MyFacesGenericPortlet } else { + if (session.getAttribute(AuthenticationHelper.SESSION_INVALIDATED) != null) + { + // remove the username preference value as explicit logout was requested by the user + request.getPreferences().reset(PREF_ALF_USERNAME); + session.removeAttribute(AuthenticationHelper.SESSION_INVALIDATED); + } + try { if (user != null) diff --git a/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java b/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java index 347118da0f..ee40374bdf 100644 --- a/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java +++ b/source/java/org/alfresco/web/app/servlet/AuthenticationHelper.java @@ -19,6 +19,7 @@ package org.alfresco.web.app.servlet; import java.io.IOException; import javax.servlet.ServletContext; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -27,25 +28,44 @@ import org.alfresco.repo.security.authentication.AuthenticationException; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.web.app.Application; import org.alfresco.web.app.portlet.AlfrescoFacesPortlet; +import org.alfresco.web.bean.LoginBean; import org.alfresco.web.bean.repository.User; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; /** + * Helper to authenticate the current user using available Ticket information. + * * @author Kevin Roast */ public final class AuthenticationHelper { - public final static String AUTHENTICATION_USER = "_alfAuthTicket"; + public static final String AUTHENTICATION_USER = "_alfAuthTicket"; + public static final String SESSION_USERNAME = "_alfLastUser"; + public static final String SESSION_INVALIDATED = "_alfSessionInvalid"; + public static final String LOGIN_BEAN = "LoginBean"; + private static final String AUTHENTICATION_SERVICE = "authenticationService"; + private static final String COOKIE_ALFUSER = "alfUser"; + + /** + * Helper to authenticate the current user using session based Ticket information. + *
+ * User information is looked up in the Session. If found the ticket is retrieved and validated.
+ * If no User info is found or the ticket is invalid then a redirect is performed to the login page.
+ *
+ * @return true if authentication successful, false otherwise.
+ */
public static boolean authenticate(ServletContext context, HttpServletRequest httpRequest, HttpServletResponse httpResponse)
throws IOException
{
// examine the appropriate session for our User object
User user;
+ LoginBean loginBean = null;
if (Application.inPortalServer() == false)
{
user = (User)httpRequest.getSession().getAttribute(AUTHENTICATION_USER);
+ loginBean = (LoginBean)httpRequest.getSession().getAttribute(LOGIN_BEAN);
}
else
{
@@ -54,7 +74,7 @@ public final class AuthenticationHelper
if (user == null)
{
- // no user/ticket - redirect to login page
+ // no user/ticket found - redirect to login page
httpResponse.sendRedirect(httpRequest.getContextPath() + "/faces" + Application.getLoginPage(context));
return false;
@@ -63,7 +83,7 @@ public final class AuthenticationHelper
{
// setup the authentication context
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
- AuthenticationService auth = (AuthenticationService)ctx.getBean("authenticationService");
+ AuthenticationService auth = (AuthenticationService)ctx.getBean(AUTHENTICATION_SERVICE);
try
{
auth.validate(user.getTicket());
@@ -75,6 +95,12 @@ public final class AuthenticationHelper
return false;
}
+ // set last authentication username cookie value
+ if (loginBean != null)
+ {
+ setUsernameCookie(httpRequest, httpResponse, loginBean.getUsernameInternal());
+ }
+
// Set the current locale
I18NUtil.setLocale(Application.getLanguage(httpRequest.getSession()));
@@ -82,12 +108,17 @@ public final class AuthenticationHelper
}
}
+ /**
+ * Helper to authenticate the current user using the supplied Ticket value.
+ *
+ * @return true if authentication successful, false otherwise.
+ */
public static boolean authenticate(ServletContext context, HttpServletRequest httpRequest, HttpServletResponse httpResponse, String ticket)
throws IOException
{
// setup the authentication context
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
- AuthenticationService auth = (AuthenticationService)ctx.getBean("authenticationService");
+ AuthenticationService auth = (AuthenticationService)ctx.getBean(AUTHENTICATION_SERVICE);
try
{
auth.validate(ticket);
@@ -102,4 +133,54 @@ public final class AuthenticationHelper
return true;
}
+
+ /**
+ * Setup the Alfresco auth cookie value.
+ *
+ * @param httpRequest
+ * @param httpResponse
+ * @param username
+ */
+ public static void setUsernameCookie(HttpServletRequest httpRequest, HttpServletResponse httpResponse, String username)
+ {
+ Cookie authCookie = getAuthCookie(httpRequest);
+ if (authCookie == null)
+ {
+ authCookie = new Cookie(COOKIE_ALFUSER, username);
+ }
+ else
+ {
+ authCookie.setValue(username);
+ }
+ authCookie.setPath(httpRequest.getContextPath());
+ // TODO: make this configurable - currently 7 days (value in seconds)
+ authCookie.setMaxAge(60*60*24*7);
+ httpResponse.addCookie(authCookie);
+ }
+
+ /**
+ * Helper to return the Alfresco auth cookie. The cookie saves the last used username value.
+ *
+ * @param httpRequest
+ *
+ * @return Cookie if found or null if not present
+ */
+ public static Cookie getAuthCookie(HttpServletRequest httpRequest)
+ {
+ Cookie authCookie = null;
+ Cookie[] cookies = httpRequest.getCookies();
+ if (cookies != null)
+ {
+ for (int i=0; i