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

rmaucher pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new bd05d5ced3 Separate the Context role mapping from security-role-ref
bd05d5ced3 is described below

commit bd05d5ced387da0c967bb232f7e3cd57685d2a7b
Author: remm <[email protected]>
AuthorDate: Fri Jul 24 21:05:00 2026 +0200

    Separate the Context role mapping from security-role-ref
---
 java/org/apache/catalina/connector/Request.java        | 11 ++++++++++-
 java/org/apache/catalina/core/StandardWrapper.java     | 10 ----------
 java/org/apache/catalina/realm/RealmBase.java          | 10 +++++++---
 test/org/apache/catalina/core/TestStandardWrapper.java | 12 ++++++++++++
 webapps/docs/changelog.xml                             |  4 ++++
 5 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/java/org/apache/catalina/connector/Request.java 
b/java/org/apache/catalina/connector/Request.java
index a9c6d761d4..a2febe97b1 100644
--- a/java/org/apache/catalina/connector/Request.java
+++ b/java/org/apache/catalina/connector/Request.java
@@ -2481,8 +2481,17 @@ public class Request implements HttpServletRequest {
             return false;
         }
 
+        // Check for a role alias defined in a <security-role-ref> element
+        Wrapper wrapper = getWrapper();
+        if (wrapper != null) {
+            String realRole = wrapper.findSecurityReference(role);
+            if (realRole != null) {
+                return realm.hasRole(wrapper, userPrincipal, realRole);
+            }
+        }
+
         // Check for a role defined directly as a <security-role>
-        return realm.hasRole(getWrapper(), userPrincipal, role);
+        return realm.hasRole(wrapper, userPrincipal, role);
     }
 
 
diff --git a/java/org/apache/catalina/core/StandardWrapper.java 
b/java/org/apache/catalina/core/StandardWrapper.java
index 3ab863a5a5..e639cfca71 100644
--- a/java/org/apache/catalina/core/StandardWrapper.java
+++ b/java/org/apache/catalina/core/StandardWrapper.java
@@ -811,16 +811,6 @@ public class StandardWrapper extends ContainerBase 
implements ServletConfig, Wra
             referencesLock.readLock().unlock();
         }
 
-        // If not specified on the Wrapper, check the Context
-        if (getParent() instanceof Context) {
-            Context context = (Context) getParent();
-            if (reference != null) {
-                reference = context.findRoleMapping(reference);
-            } else {
-                reference = context.findRoleMapping(name);
-            }
-        }
-
         return reference;
     }
 
diff --git a/java/org/apache/catalina/realm/RealmBase.java 
b/java/org/apache/catalina/realm/RealmBase.java
index 9a9e4e6916..b97e979d07 100644
--- a/java/org/apache/catalina/realm/RealmBase.java
+++ b/java/org/apache/catalina/realm/RealmBase.java
@@ -910,9 +910,13 @@ public abstract class RealmBase extends LifecycleMBeanBase 
implements Realm {
     public boolean hasRole(Wrapper wrapper, Principal principal, String role) {
         // Check for a role alias
         if (wrapper != null) {
-            String realRole = wrapper.findSecurityReference(role);
-            if (realRole != null) {
-                role = realRole;
+            Container parent = wrapper.getParent();
+            if (parent instanceof Context) {
+                Context context = (Context) parent;
+                String realRole = context.findRoleMapping(role);
+                if (realRole != null) {
+                    role = realRole;
+                }
             }
         }
 
diff --git a/test/org/apache/catalina/core/TestStandardWrapper.java 
b/test/org/apache/catalina/core/TestStandardWrapper.java
index ba5b52efb3..a154f5a104 100644
--- a/test/org/apache/catalina/core/TestStandardWrapper.java
+++ b/test/org/apache/catalina/core/TestStandardWrapper.java
@@ -253,6 +253,8 @@ public class TestStandardWrapper extends TomcatBaseTest {
         ctx.addRoleMapping("testRole", "very-complex-role-name");
 
         Wrapper wrapper = Tomcat.addServlet(ctx, "servlet", 
RoleAllowServlet.class.getName());
+        wrapper.addSecurityReference("testSecurityRoleRef", 
"very-complex-role-name");
+        wrapper.addSecurityReference("testSecurityRoleRef2", "testRole");
         ctx.addServletMappingDecoded("/", "servlet");
 
         ctx.setLoginConfig(new LoginConfig("BASIC", null, null, null));
@@ -356,6 +358,8 @@ public class TestStandardWrapper extends TomcatBaseTest {
             TesterMapRealm realm = new TesterMapRealm();
             realm.addUser("testUser", "testPwd");
             realm.addUserRole("testUser", "testRole");
+            realm.addUserRole("testUser", "testSecurityRoleRef");
+            realm.addUserRole("testUser", "testSecurityRoleRef2");
             ctx.setRealm(realm);
 
             ctx.setLoginConfig(new LoginConfig("BASIC", null, null, null));
@@ -434,6 +438,14 @@ public class TestStandardWrapper extends TomcatBaseTest {
     @ServletSecurity(@HttpConstraint(rolesAllowed = "testRole"))
     public static class RoleAllowServlet extends TestServlet {
         private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {
+            if (!req.isUserInRole("testSecurityRoleRef") || 
!req.isUserInRole("testSecurityRoleRef2")) {
+                throw new ServletException("Non functional security-role-ref");
+            }
+            super.doGet(req, resp);
+        }
     }
 
     @ServletSecurity(@HttpConstraint(rolesAllowed = "otherRole"))
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 976ccdb170..7220af2129 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -157,6 +157,10 @@
         the client provided nonce count is at the upper boundary of the window
         (markt).
       </fix>
+      <update>
+        Separate the <code>Context</code> role mapping from the Servlet
+        specification <code>security-role-ref</code>. (remm)
+      </update>
     </changelog>
   </subsection>
   <subsection name="Coyote">


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to