This is an automated email from the ASF dual-hosted git repository.

lprimak pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shiro.git


The following commit(s) were added to refs/heads/main by this push:
     new a46600f2c improvement: implemented session key rotation via 
changeSessionId() in Web-Container mode only
a46600f2c is described below

commit a46600f2cf7856aae4e8507e1e4c7063447845e2
Author: lprimak <[email protected]>
AuthorDate: Wed May 6 19:33:54 2026 -0500

    improvement: implemented session key rotation via changeSessionId() in 
Web-Container mode only
---
 .../java/org/apache/shiro/mgt/DefaultSecurityManager.java | 15 ++++++++++-----
 .../apache/shiro/web/mgt/DefaultWebSecurityManager.java   | 15 +++++++++++++++
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git 
a/core/src/main/java/org/apache/shiro/mgt/DefaultSecurityManager.java 
b/core/src/main/java/org/apache/shiro/mgt/DefaultSecurityManager.java
index 0f7b7e8c2..6ca07fc6f 100644
--- a/core/src/main/java/org/apache/shiro/mgt/DefaultSecurityManager.java
+++ b/core/src/main/java/org/apache/shiro/mgt/DefaultSecurityManager.java
@@ -288,11 +288,7 @@ public class DefaultSecurityManager extends 
SessionsSecurityManager {
             throw ae;
         }
 
-        Session existingSession = subject.getSession(false);
-        if (existingSession != null) {
-            existingSession.stop();
-        }
-
+        beforeSuccessfulLogin(subject);
         Subject loggedIn = createSubject(token, info, subject);
 
         onSuccessfulLogin(token, info, loggedIn);
@@ -300,6 +296,15 @@ public class DefaultSecurityManager extends 
SessionsSecurityManager {
         return loggedIn;
     }
 
+    /**
+     * Invoked before a successful login is processed.  This implementation 
checks for an existing session and stops it
+     *
+     * @param subject Subject
+     */
+    protected void beforeSuccessfulLogin(Subject subject) {
+        stopSession(subject);
+    }
+
     protected void onSuccessfulLogin(AuthenticationToken token, 
AuthenticationInfo info, Subject subject) {
         rememberMeSuccessfulLogin(token, info, subject);
     }
diff --git 
a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java 
b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java
index 02b515c9a..2fce1c9e7 100644
--- a/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java
+++ b/web/src/main/java/org/apache/shiro/web/mgt/DefaultWebSecurityManager.java
@@ -23,6 +23,7 @@ import org.apache.shiro.mgt.DefaultSubjectDAO;
 import org.apache.shiro.mgt.SessionStorageEvaluator;
 import org.apache.shiro.mgt.SubjectDAO;
 import org.apache.shiro.realm.Realm;
+import org.apache.shiro.session.Session;
 import org.apache.shiro.session.mgt.SessionContext;
 import org.apache.shiro.session.mgt.SessionKey;
 import org.apache.shiro.session.mgt.SessionManager;
@@ -38,6 +39,7 @@ import org.apache.shiro.web.session.mgt.WebSessionManager;
 import org.apache.shiro.web.subject.WebSubject;
 import org.apache.shiro.web.subject.WebSubjectContext;
 import org.apache.shiro.web.subject.support.DefaultWebSubjectContext;
+import org.apache.shiro.web.subject.support.WebDelegatingSubject;
 import org.apache.shiro.web.util.WebUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -252,6 +254,19 @@ public class DefaultWebSecurityManager extends 
DefaultSecurityManager implements
         }
     }
 
+    @Override
+    protected void beforeSuccessfulLogin(Subject subject) {
+        if (isHttpSessionMode()) {
+            Session session = subject.getSession(false);
+            if (session != null) {
+                WebUtils.toHttp(((WebDelegatingSubject) 
subject).getServletRequest()).changeSessionId();
+            }
+        } else {
+            super.beforeSuccessfulLogin(subject);
+        }
+    }
+
+
     @Override
     protected void beforeLogout(Subject subject) {
         super.beforeLogout(subject);

Reply via email to