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 c95a185e6 enh: reverted secureInDevMode addition and added native 
session management secure cookie Secure session and rememberMe cookies are 
turned off is the initial request that created them is insecure
c95a185e6 is described below

commit c95a185e6ed2b4668ab25e6313717e6e1182a2b9
Author: lprimak <[email protected]>
AuthorDate: Sat May 2 23:47:03 2026 -0500

    enh: reverted secureInDevMode addition and added native session management 
secure cookie
    Secure session and rememberMe cookies are turned off is the initial request 
that created them is insecure
---
 .../shiro/session/mgt/DefaultSessionManager.java   |  1 +
 .../ee/listeners/EnvironmentLoaderListener.java    | 17 ++----------
 .../web/config/AbstractShiroWebConfiguration.java  |  4 +--
 .../shiro/web/mgt/CookieRememberMeManager.java     | 32 ++--------------------
 .../org/apache/shiro/web/servlet/SimpleCookie.java |  2 +-
 .../web/session/mgt/DefaultWebSessionManager.java  |  3 ++
 .../mgt/DefaultWebSessionManagerTest.groovy        |  8 +++++-
 7 files changed, 18 insertions(+), 49 deletions(-)

diff --git 
a/core/src/main/java/org/apache/shiro/session/mgt/DefaultSessionManager.java 
b/core/src/main/java/org/apache/shiro/session/mgt/DefaultSessionManager.java
index 604a9de42..7844b5929 100644
--- a/core/src/main/java/org/apache/shiro/session/mgt/DefaultSessionManager.java
+++ b/core/src/main/java/org/apache/shiro/session/mgt/DefaultSessionManager.java
@@ -39,6 +39,7 @@ import java.util.Date;
  * @since 0.1
  */
 public class DefaultSessionManager extends AbstractValidatingSessionManager 
implements CacheManagerAware {
+    public static final String SECURE_COOKIE_DISABLED =  
"org.apache.shiro.cookie.secure.disabled";
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultSessionManager.class);
 
diff --git 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
index bc5935160..33cf25c4a 100644
--- 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
+++ 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
@@ -24,11 +24,8 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.SessionTrackingMode;
 import javax.servlet.annotation.WebListener;
 
-import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.mgt.DefaultSecurityManager;
 import org.apache.shiro.web.env.EnvironmentLoader;
 import org.apache.shiro.web.env.WebEnvironment;
-import org.apache.shiro.web.mgt.CookieRememberMeManager;
 import org.omnifaces.util.Faces;
 import static org.apache.shiro.ee.listeners.IniEnvironment.hasFacesContext;
 
@@ -114,19 +111,9 @@ public class EnvironmentLoaderListener extends 
EnvironmentLoader implements Serv
                     
.getInitParameter(SHIRO_EE_SESSION_TRACKING_CONFIGURATION_DISABLED_PARAM))) {
                 modifySessionTrackingConfiguration(sce);
             }
-            modifySecureSessionConfiguration(sce);
 
-            WebEnvironment environment = 
initEnvironment(sce.getServletContext());
-            if (hasFacesContext() && Faces.isDevelopment()
-                    && 
SecurityUtils.unwrapSecurityManager(environment.getWebSecurityManager(), 
DefaultSecurityManager.class)
-                    .getRememberMeManager() instanceof 
CookieRememberMeManager) {
-                var rememberMeManager = (CookieRememberMeManager) SecurityUtils
-                        
.unwrapSecurityManager(environment.getWebSecurityManager(), 
DefaultSecurityManager.class)
-                        .getRememberMeManager();
-                    if (!rememberMeManager.isSecureInDevMode()) {
-                    rememberMeManager.getCookie().setSecure(false);
-                }
-            }
+            modifySecureSessionConfiguration(sce);
+            initEnvironment(sce.getServletContext());
         }
     }
 
diff --git 
a/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebConfiguration.java
 
b/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebConfiguration.java
index 6c73448f1..aee139dee 100644
--- 
a/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebConfiguration.java
+++ 
b/support/spring/src/main/java/org/apache/shiro/spring/web/config/AbstractShiroWebConfiguration.java
@@ -61,10 +61,10 @@ public class AbstractShiroWebConfiguration extends 
AbstractShiroConfiguration {
     @Value("#{ @environment['shiro.sessionManager.cookie.domain'] ?: null }")
     protected String sessionIdCookieDomain;
 
-    @Value("#{ @environment['shiro.sessionManager.cookie.path'] ?: null }")
+    @Value("#{ @environment['shiro.sessionManager.cookie.path'] ?: 
T(org.apache.shiro.web.servlet.Cookie).ROOT_PATH }")
     protected String sessionIdCookiePath;
 
-    @Value("#{ @environment['shiro.sessionManager.cookie.secure'] ?: false }")
+    @Value("#{ @environment['shiro.sessionManager.cookie.secure'] ?: true }")
     protected boolean sessionIdCookieSecure;
 
     @Value("#{ @environment['shiro.sessionManager.cookie.sameSite'] ?:"
diff --git 
a/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java 
b/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java
index 7e58d1e11..cc50bd95c 100644
--- a/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java
+++ b/web/src/main/java/org/apache/shiro/web/mgt/CookieRememberMeManager.java
@@ -36,6 +36,7 @@ import org.slf4j.LoggerFactory;
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import static 
org.apache.shiro.session.mgt.DefaultSessionManager.SECURE_COOKIE_DISABLED;
 
 
 /**
@@ -76,12 +77,10 @@ public class CookieRememberMeManager extends 
AbstractRememberMeManager {
      * The default name of the underlying rememberMe cookie which is {@code 
rememberMe}.
      */
     public static final String DEFAULT_REMEMBER_ME_COOKIE_NAME = "rememberMe";
-    public static final String REMEMBER_ME_SECURE_COOKIE_DISABLED =  
"org.apache.shiro.rememberMe.secure.disabled";
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(CookieRememberMeManager.class);
 
     private Cookie cookie;
-    private boolean secureInDevMode = true;
 
     /**
      * Constructs a new {@code CookieRememberMeManager} with a default {@code 
rememberMe} cookie template.
@@ -130,33 +129,6 @@ public class CookieRememberMeManager extends 
AbstractRememberMeManager {
         this.cookie = cookie;
     }
 
-    /**
-     * Returns {@code true} if the rememberMe cookie should be marked as 
secure when the application is running in
-     * development mode.  This is a convenience method that allows users to 
set the rememberMe cookie as secure in
-     * production environments but not in development environments where SSL 
is often not used.
-     * The default value is {@code true}.
-     * @return {@code true} if the rememberMe cookie should be marked as 
secure when the application is running in
-     * development mode, {@code false} otherwise (the default value is {@code 
true}).
-     * @since 2.1.1
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public boolean isSecureInDevMode() {
-        return secureInDevMode;
-    }
-
-    /**
-     * Sets whether the rememberMe cookie should be marked as secure when the 
application is running in development mode.
-     * This is a convenience method that allows users to set the rememberMe 
cookie as secure in production environments but not
-     * in development environments where SSL is often not used.  The default 
value is {@code true}.
-     * @param secureInDevMode set to {@code true} if the rememberMe cookie 
should be marked as secure when the
-     * application is running in development mode, {@code false} otherwise 
(the default value is {@code true}).
-     * @since 2.1.1
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public void setSecureInDevMode(boolean secureInDevMode) {
-        this.secureInDevMode = secureInDevMode;
-    }
-
     /**
      * Base64-encodes the specified serialized byte array and sets that 
base64-encoded String as the cookie value.
      * <p/>
@@ -342,7 +314,7 @@ public class CookieRememberMeManager extends 
AbstractRememberMeManager {
     private Cookie createDefaultCookie() {
         Cookie cookie = new SimpleCookie(DEFAULT_REMEMBER_ME_COOKIE_NAME);
         cookie.setHttpOnly(true);
-        if (!Boolean.getBoolean(REMEMBER_ME_SECURE_COOKIE_DISABLED)) {
+        if (!Boolean.getBoolean(SECURE_COOKIE_DISABLED)) {
             cookie.setSecure(true);
         }
         //One year should be long enough - most sites won't object to 
requiring a user to log in if they haven't visited
diff --git a/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java 
b/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java
index 558346a96..db895ad20 100644
--- a/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java
+++ b/web/src/main/java/org/apache/shiro/web/servlet/SimpleCookie.java
@@ -250,7 +250,7 @@ public class SimpleCookie implements Cookie {
         String path = calculatePath(request);
         int maxAge = getMaxAge();
         int version = getVersion();
-        boolean secure = isSecure();
+        boolean secure = isSecure() && request.isSecure();
         boolean httpOnly = isHttpOnly();
         SameSiteOptions sameSite = getSameSite();
 
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 709c15862..d927f2ab9 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
@@ -57,6 +57,9 @@ public class DefaultWebSessionManager extends 
DefaultSessionManager implements W
         Cookie cookie = new 
SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
         //more secure, protects against XSS attacks
         cookie.setHttpOnly(true);
+        if (!Boolean.getBoolean(SECURE_COOKIE_DISABLED)) {
+            cookie.setSecure(true);
+        }
         this.sessionIdCookie = cookie;
         this.sessionIdCookieEnabled = true;
         this.sessionIdUrlRewritingEnabled = false;
diff --git 
a/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy
 
b/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy
index 4b0895c7c..e57ff8306 100644
--- 
a/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy
+++ 
b/web/src/test/groovy/org/apache/shiro/web/session/mgt/DefaultWebSessionManagerTest.groovy
@@ -65,7 +65,8 @@ public class DefaultWebSessionManagerTest {
         session.setId("12345");
 
         WebSessionContext wsc = new DefaultWebSessionContext();
-        wsc.setServletRequest(createMock(HttpServletRequest.class));
+        HttpServletRequest servletRequest = 
createMock(HttpServletRequest.class);
+        wsc.setServletRequest(servletRequest);
         wsc.setServletResponse(createMock(HttpServletResponse.class));
 
         //test that the cookie template is being used:
@@ -77,10 +78,15 @@ public class DefaultWebSessionManagerTest {
         expect(cookie.getPath()).andReturn("/");
         expect(cookie.getVersion()).andReturn(SimpleCookie.DEFAULT_VERSION);
         expect(cookie.isSecure()).andReturn(true);
+        expect(servletRequest.isSecure()).andReturn(true);
         expect(cookie.isHttpOnly()).andReturn(true);
         expect(cookie.getSameSite()).andReturn(Cookie.SameSiteOptions.LAX);
 
+        
servletRequest.removeAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE);
+        
servletRequest.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_IS_NEW, 
Boolean.TRUE);
+
         replay(cookie);
+        replay(servletRequest);
 
         mgr.onStart(session, wsc);
 

Reply via email to