|
16 | 16 |
|
17 | 17 | import jakarta.enterprise.inject.Instance;
|
18 | 18 |
|
| 19 | +import io.quarkus.arc.ClientProxy; |
19 | 20 | import io.quarkus.runtime.configuration.ConfigurationException;
|
20 | 21 | import io.quarkus.security.StringPermission;
|
21 | 22 | import io.quarkus.security.identity.SecurityIdentity;
|
@@ -236,7 +237,10 @@ private static Map<String, HttpSecurityPolicy> toNamedHttpSecPolicies(Map<String
|
236 | 237 | if (policy.name().isBlank()) {
|
237 | 238 | throw new ConfigurationException("HTTP Security policy '" + policy + "' name must not be blank");
|
238 | 239 | }
|
239 |
| - namedPolicies.put(policy.name(), policy); |
| 240 | + var previousPolicy = namedPolicies.put(policy.name(), policy); |
| 241 | + if (previousPolicy != null) { |
| 242 | + throw duplicateNamedPoliciesNotAllowedEx(previousPolicy, policy); |
| 243 | + } |
240 | 244 | }
|
241 | 245 | }
|
242 | 246 |
|
@@ -271,12 +275,26 @@ private static Map<String, HttpSecurityPolicy> toNamedHttpSecPolicies(Map<String
|
271 | 275 | roleToPermissions.put(role, Set.copyOf(permissions));
|
272 | 276 | }
|
273 | 277 | }
|
274 |
| - namedPolicies.put(e.getKey(), |
275 |
| - new RolesAllowedHttpSecurityPolicy(policyConfig.rolesAllowed(), roleToPermissions, policyConfig.roles())); |
| 278 | + var rolesAllowedPolicy = new RolesAllowedHttpSecurityPolicy(policyConfig.rolesAllowed(), roleToPermissions, |
| 279 | + policyConfig.roles()); |
| 280 | + var previousPolicy = namedPolicies.put(e.getKey(), rolesAllowedPolicy); |
| 281 | + if (previousPolicy != null) { |
| 282 | + throw duplicateNamedPoliciesNotAllowedEx(previousPolicy, rolesAllowedPolicy); |
| 283 | + } |
| 284 | + } |
| 285 | + |
| 286 | + var previousPolicy = namedPolicies.put("deny", DenySecurityPolicy.INSTANCE); |
| 287 | + if (previousPolicy != null) { |
| 288 | + throw duplicateNamedPoliciesNotAllowedEx(previousPolicy, DenySecurityPolicy.INSTANCE); |
| 289 | + } |
| 290 | + previousPolicy = namedPolicies.put("permit", new PermitSecurityPolicy()); |
| 291 | + if (previousPolicy != null) { |
| 292 | + throw duplicateNamedPoliciesNotAllowedEx(previousPolicy, new PermitSecurityPolicy()); |
| 293 | + } |
| 294 | + previousPolicy = namedPolicies.put("authenticated", new AuthenticatedHttpSecurityPolicy()); |
| 295 | + if (previousPolicy != null) { |
| 296 | + throw duplicateNamedPoliciesNotAllowedEx(previousPolicy, new AuthenticatedHttpSecurityPolicy()); |
276 | 297 | }
|
277 |
| - namedPolicies.put("deny", new DenySecurityPolicy()); |
278 |
| - namedPolicies.put("permit", new PermitSecurityPolicy()); |
279 |
| - namedPolicies.put("authenticated", new AuthenticatedHttpSecurityPolicy()); |
280 | 298 | return namedPolicies;
|
281 | 299 | }
|
282 | 300 |
|
@@ -386,6 +404,13 @@ private void addAction(String action) {
|
386 | 404 | }
|
387 | 405 | }
|
388 | 406 |
|
| 407 | + static ConfigurationException duplicateNamedPoliciesNotAllowedEx(HttpSecurityPolicy policy1, HttpSecurityPolicy policy2) { |
| 408 | + String policyClassName1 = ClientProxy.unwrap(policy1).getClass().getName(); |
| 409 | + String policyClassName2 = ClientProxy.unwrap(policy2).getClass().getName(); |
| 410 | + return new ConfigurationException("Only one HttpSecurityPolicy with the name '" |
| 411 | + + policy1.name() + "' is allowed, but found: " + policyClassName1 + " and " + policyClassName2); |
| 412 | + } |
| 413 | + |
389 | 414 | record HttpMatcher(String authMechanism, Set<String> methods, HttpSecurityPolicy checker) {
|
390 | 415 |
|
391 | 416 | }
|
|
0 commit comments