Skip to content

Commit 78527a2

Browse files
authored
Merge pull request #7111 from GlobalDataverseCommunityConsortium/IQSS/3254
adding support for changing sessionId at login
2 parents a6f580f + 3ac1ed5 commit 78527a2

3 files changed

Lines changed: 38 additions & 2 deletions

File tree

src/main/java/edu/harvard/iq/dataverse/DataverseSession.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import edu.harvard.iq.dataverse.actionlogging.ActionLogServiceBean;
77
import edu.harvard.iq.dataverse.authorization.users.GuestUser;
88
import edu.harvard.iq.dataverse.authorization.users.User;
9+
import edu.harvard.iq.dataverse.util.SessionUtil;
910
import edu.harvard.iq.dataverse.util.SystemConfig;
1011
import java.io.IOException;
1112
import java.io.Serializable;
@@ -61,7 +62,8 @@ public void setUser(User aUser) {
6162
logSvc.log(
6263
new ActionLogRecord(ActionLogRecord.ActionType.SessionManagement,(aUser==null) ? "logout" : "login")
6364
.setUserIdentifier((aUser!=null) ? aUser.getIdentifier() : (user!=null ? user.getIdentifier() : "") ));
64-
65+
//#3254 - change session id when user changes
66+
SessionUtil.changeSessionId((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest());
6567
this.user = aUser;
6668
}
6769

src/main/java/edu/harvard/iq/dataverse/LoginPage.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
1414
import edu.harvard.iq.dataverse.util.BundleUtil;
1515
import edu.harvard.iq.dataverse.util.JsfHelper;
16+
import edu.harvard.iq.dataverse.util.SessionUtil;
17+
1618
import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
1719
import edu.harvard.iq.dataverse.util.SystemConfig;
1820
import java.io.UnsupportedEncodingException;
@@ -29,6 +31,7 @@
2931
import javax.faces.view.ViewScoped;
3032
import javax.inject.Inject;
3133
import javax.inject.Named;
34+
import javax.servlet.http.HttpServletRequest;
3235

3336
/**
3437
*
@@ -169,7 +172,6 @@ public String login() {
169172
logger.log(Level.FINE, "User authenticated: {0}", r.getEmail());
170173
session.setUser(r);
171174
session.configureSessionTimeout();
172-
173175
if ("dataverse.xhtml".equals(redirectPage)) {
174176
redirectPage = redirectToRoot();
175177
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package edu.harvard.iq.dataverse.util;
2+
3+
import java.util.Enumeration;
4+
import java.util.HashMap;
5+
import java.util.Map.Entry;
6+
7+
import javax.servlet.http.HttpServletRequest;
8+
import javax.servlet.http.HttpSession;
9+
10+
public class SessionUtil {
11+
12+
/**
13+
* Changes the session id (jsessionId) - for use when the session's authority increases (i.e. at login)
14+
* Servlet 3.1 Note: This method is needed while using Servlets 2.0. 3.1 has a HttpServletRequest.chageSessionId(); method that can be used instead.
15+
*
16+
* @param h the current HttpServletRequest
17+
* e.g. for pages you can get this from (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
18+
*/
19+
public static void changeSessionId(HttpServletRequest h) {
20+
HttpSession session = h.getSession(false);
21+
HashMap<String, Object> sessionAttributes = new HashMap<String,Object>();
22+
for(Enumeration<String> e = session.getAttributeNames();e.hasMoreElements();) {
23+
String name = e.nextElement();
24+
sessionAttributes.put(name, session.getAttribute(name));
25+
}
26+
h.getSession().invalidate();
27+
session = h.getSession(true);
28+
for(Entry<String, Object> entry: sessionAttributes.entrySet()) {
29+
session.setAttribute(entry.getKey(), entry.getValue());
30+
}
31+
}
32+
}

0 commit comments

Comments
 (0)