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 7cb2054b2 Enhancement: support for remembered principals in session 
management, check w… (#2859)
7cb2054b2 is described below

commit 7cb2054b200ccd94dfcf7432157afddccb6f666c
Author: Lenny Primak <[email protected]>
AuthorDate: Sun Aug 16 12:45:00 2026 -0500

    Enhancement: support for remembered principals in session management, check 
w… (#2859)
---
 .../java/org/apache/shiro/mgt/DefaultSecurityManager.java |  7 ++++---
 .../java/org/apache/shiro/subject/SubjectContext.java     | 15 +++++++++++++++
 .../shiro/subject/support/DefaultSubjectContext.java      | 11 +++++++++++
 .../shiro/web/session/mgt/DefaultWebSessionManager.java   |  8 +++-----
 4 files changed, 33 insertions(+), 8 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 ebf05622f..86155b570 100644
--- a/core/src/main/java/org/apache/shiro/mgt/DefaultSecurityManager.java
+++ b/core/src/main/java/org/apache/shiro/mgt/DefaultSecurityManager.java
@@ -379,6 +379,9 @@ public class DefaultSecurityManager extends 
SessionsSecurityManager {
         //session, so we don't constantly rehydrate the rememberMe 
PrincipalCollection on every operation).
         //Added in 1.2:
         if (context.isSessionCreationEnabled()) {
+            if (context.isRememberedPrincipals()) {
+                beforeSuccessfulLogin(subject);
+            }
             save(subject);
         }
 
@@ -439,7 +442,6 @@ public class DefaultSecurityManager extends 
SessionsSecurityManager {
      * @return The SubjectContext to use to pass to a {@link SubjectFactory} 
for subject creation.
      * @since 1.0
      */
-    @SuppressWarnings({"unchecked"})
     protected SubjectContext ensureSecurityManager(SubjectContext context) {
         if (context.resolveSecurityManager() != null) {
             LOGGER.trace("Context already contains a SecurityManager instance. 
 Returning.");
@@ -463,7 +465,6 @@ public class DefaultSecurityManager extends 
SessionsSecurityManager {
      * @return The context to use to pass to a {@link SubjectFactory} for 
subject creation.
      * @since 1.0
      */
-    @SuppressWarnings({"unchecked"})
     protected SubjectContext resolveSession(SubjectContext context) {
         if (context.resolveSession() != null) {
             LOGGER.debug("Context already contains a session.  Returning.");
@@ -518,7 +519,6 @@ public class DefaultSecurityManager extends 
SessionsSecurityManager {
      * @return The Subject context to use to pass to a {@link SubjectFactory} 
for subject creation.
      * @since 1.0
      */
-    @SuppressWarnings({"unchecked"})
     protected SubjectContext resolvePrincipals(SubjectContext context) {
 
         PrincipalCollection principals = context.resolvePrincipals();
@@ -531,6 +531,7 @@ public class DefaultSecurityManager extends 
SessionsSecurityManager {
             if (!isEmpty(principals)) {
                 LOGGER.debug("Found remembered PrincipalCollection.  Adding to 
the context to be used "
                         + "for subject construction by the SubjectFactory.");
+                context.setRememberedPrincipals(true);
 
                 context.setPrincipals(principals);
 
diff --git a/core/src/main/java/org/apache/shiro/subject/SubjectContext.java 
b/core/src/main/java/org/apache/shiro/subject/SubjectContext.java
index d9e29a639..a57ec64d1 100644
--- a/core/src/main/java/org/apache/shiro/subject/SubjectContext.java
+++ b/core/src/main/java/org/apache/shiro/subject/SubjectContext.java
@@ -235,4 +235,19 @@ public interface SubjectContext extends Map<String, 
Object> {
     void setHost(String host);
 
     String resolveHost();
+
+    /**
+     * Sets whether the constructed {@code Subject} instance should was 
constructed from remembered principals
+     */
+    default void setRememberedPrincipals(boolean rememberedPrincipals) {
+        throw new IllegalStateException("Remembered principals are not 
supported by this SubjectContext implementation.");
+    }
+
+    /**
+     * Returns whether the constructed {@code Subject} instance was 
constructed from remembered principals
+     * @return true if the constructed {@code Subject} instance was 
constructed from remembered principals, false otherwise
+     */
+    default boolean isRememberedPrincipals() {
+        throw new IllegalStateException("Remembered principals are not 
supported by this SubjectContext implementation.");
+    }
 }
diff --git 
a/core/src/main/java/org/apache/shiro/subject/support/DefaultSubjectContext.java
 
b/core/src/main/java/org/apache/shiro/subject/support/DefaultSubjectContext.java
index 54cb73e4d..f14612bee 100644
--- 
a/core/src/main/java/org/apache/shiro/subject/support/DefaultSubjectContext.java
+++ 
b/core/src/main/java/org/apache/shiro/subject/support/DefaultSubjectContext.java
@@ -79,6 +79,8 @@ public class DefaultSubjectContext extends MapContext 
implements SubjectContext
 
     private static final String HOST = DefaultSubjectContext.class.getName() + 
".HOST";
 
+    private static final String REMEMBERED_PRINCIPALS = 
DefaultSubjectContext.class.getName() + ".REMEMBERED_PRINCIPALS";
+
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultSubjectContext.class);
 
     public DefaultSubjectContext() {
@@ -279,4 +281,13 @@ public class DefaultSubjectContext extends MapContext 
implements SubjectContext
 
         return host;
     }
+
+    public void setRememberedPrincipals(boolean remembered) {
+        put(REMEMBERED_PRINCIPALS, remembered);
+    }
+
+    public boolean isRememberedPrincipals() {
+        Boolean remembered = getTypedValue(REMEMBERED_PRINCIPALS, 
Boolean.class);
+        return remembered != null && remembered;
+    }
 }
diff --git 
a/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java
 
b/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java
index 2f00b326a..759e41ab5 100644
--- 
a/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java
+++ 
b/web/src/main/java/org/apache/shiro/web/session/mgt/DefaultWebSessionManager.java
@@ -114,11 +114,10 @@ public class DefaultWebSessionManager extends 
DefaultSessionManager implements W
             LOGGER.debug("Session ID cookie is disabled - session id will not 
be acquired from a request cookie.");
             return null;
         }
-        if (!(request instanceof HttpServletRequest)) {
+        if (!(request instanceof HttpServletRequest httpRequest)) {
             LOGGER.debug("Current request is not an HttpServletRequest - 
cannot get session ID cookie.  Returning null.");
             return null;
         }
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
         return getSessionIdCookie().readValue(httpRequest, 
WebUtils.toHttp(response));
     }
 
@@ -128,7 +127,7 @@ public class DefaultWebSessionManager extends 
DefaultSessionManager implements W
         if (id != null) {
             
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,
                     ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);
-        } else {
+        } else if (isSessionIdUrlRewritingEnabled()) {
             //not in a cookie, or cookie is disabled - try the request URI as 
a fallback (i.e. due to URL rewriting):
 
             //try the URI path segment parameters first:
@@ -170,10 +169,9 @@ public class DefaultWebSessionManager extends 
DefaultSessionManager implements W
     //since 1.2.2
     private String getUriPathSegmentParamValue(ServletRequest servletRequest, 
String paramName) {
 
-        if (!(servletRequest instanceof HttpServletRequest)) {
+        if (!(servletRequest instanceof HttpServletRequest request)) {
             return null;
         }
-        HttpServletRequest request = (HttpServletRequest) servletRequest;
         String uri = request.getRequestURI();
         if (uri == null) {
             return null;

Reply via email to