|
34 | 34 | import org.springframework.security.web.header.writers.FeaturePolicyHeaderWriter;
|
35 | 35 | import org.springframework.security.web.header.writers.HpkpHeaderWriter;
|
36 | 36 | import org.springframework.security.web.header.writers.HstsHeaderWriter;
|
| 37 | +import org.springframework.security.web.header.writers.PermissionsPolicyHeaderWriter; |
37 | 38 | import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter;
|
38 | 39 | import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter.ReferrerPolicy;
|
39 | 40 | import org.springframework.security.web.header.writers.XContentTypeOptionsHeaderWriter;
|
@@ -93,6 +94,8 @@ public class HeadersConfigurer<H extends HttpSecurityBuilder<H>>
|
93 | 94 |
|
94 | 95 | private final FeaturePolicyConfig featurePolicy = new FeaturePolicyConfig();
|
95 | 96 |
|
| 97 | + private final PermissionsPolicyConfig permissionsPolicy = new PermissionsPolicyConfig(); |
| 98 | + |
96 | 99 | /**
|
97 | 100 | * Creates a new instance
|
98 | 101 | *
|
@@ -387,6 +390,7 @@ private List<HeaderWriter> getHeaderWriters() {
|
387 | 390 | addIfNotNull(writers, this.contentSecurityPolicy.writer);
|
388 | 391 | addIfNotNull(writers, this.referrerPolicy.writer);
|
389 | 392 | addIfNotNull(writers, this.featurePolicy.writer);
|
| 393 | + addIfNotNull(writers, this.permissionsPolicy.writer); |
390 | 394 | writers.addAll(this.headerWriters);
|
391 | 395 | return writers;
|
392 | 396 | }
|
@@ -487,12 +491,58 @@ public HeadersConfigurer<H> referrerPolicy(Customizer<ReferrerPolicyConfig> refe
|
487 | 491 | * @throws IllegalArgumentException if policyDirectives is {@code null} or empty
|
488 | 492 | * @since 5.1
|
489 | 493 | * @see FeaturePolicyHeaderWriter
|
| 494 | + * @deprecated Use {@link #permissionsPolicy(Customizer)} instead. |
490 | 495 | */
|
| 496 | + @Deprecated |
491 | 497 | public FeaturePolicyConfig featurePolicy(String policyDirectives) {
|
492 | 498 | this.featurePolicy.writer = new FeaturePolicyHeaderWriter(policyDirectives);
|
493 | 499 | return this.featurePolicy;
|
494 | 500 | }
|
495 | 501 |
|
| 502 | + /** |
| 503 | + * <p> |
| 504 | + * Allows configuration for |
| 505 | + * <a href="https://w3c.github.io/webappsec-permissions-policy/">Permissions |
| 506 | + * Policy</a>. |
| 507 | + * </p> |
| 508 | + * |
| 509 | + * <p> |
| 510 | + * Configuration is provided to the {@link PermissionsPolicyHeaderWriter} which |
| 511 | + * support the writing of the header as detailed in the W3C Technical Report: |
| 512 | + * </p> |
| 513 | + * <ul> |
| 514 | + * <li>Permissions-Policy</li> |
| 515 | + * </ul> |
| 516 | + * @return the {@link PermissionsPolicyConfig} for additional configuration |
| 517 | + * @since 5.5 |
| 518 | + * @see PermissionsPolicyHeaderWriter |
| 519 | + */ |
| 520 | + public PermissionsPolicyConfig permissionsPolicy() { |
| 521 | + this.permissionsPolicy.writer = new PermissionsPolicyHeaderWriter(); |
| 522 | + return this.permissionsPolicy; |
| 523 | + } |
| 524 | + |
| 525 | + /** |
| 526 | + * Allows configuration for |
| 527 | + * <a href="https://w3c.github.io/webappsec-permissions-policy/"> Permissions |
| 528 | + * Policy</a>. |
| 529 | + * <p> |
| 530 | + * Calling this method automatically enables (includes) the {@code Permissions-Policy} |
| 531 | + * header in the response using the supplied policy directive(s). |
| 532 | + * <p> |
| 533 | + * Configuration is provided to the {@link PermissionsPolicyHeaderWriter} which is |
| 534 | + * responsible for writing the header. |
| 535 | + * @return the {@link PermissionsPolicyConfig} for additional configuration |
| 536 | + * @throws IllegalArgumentException if policyDirectives is {@code null} or empty |
| 537 | + * @since 5.5 |
| 538 | + * @see PermissionsPolicyHeaderWriter |
| 539 | + */ |
| 540 | + public PermissionsPolicyConfig permissionsPolicy(Customizer<PermissionsPolicyConfig> permissionsPolicyCustomizer) { |
| 541 | + this.permissionsPolicy.writer = new PermissionsPolicyHeaderWriter(); |
| 542 | + permissionsPolicyCustomizer.customize(this.permissionsPolicy); |
| 543 | + return this.permissionsPolicy; |
| 544 | + } |
| 545 | + |
496 | 546 | public final class ContentTypeOptionsConfig {
|
497 | 547 |
|
498 | 548 | private XContentTypeOptionsHeaderWriter writer;
|
@@ -1063,4 +1113,33 @@ public HeadersConfigurer<H> and() {
|
1063 | 1113 |
|
1064 | 1114 | }
|
1065 | 1115 |
|
| 1116 | + public final class PermissionsPolicyConfig { |
| 1117 | + |
| 1118 | + private PermissionsPolicyHeaderWriter writer; |
| 1119 | + |
| 1120 | + private PermissionsPolicyConfig() { |
| 1121 | + } |
| 1122 | + |
| 1123 | + /** |
| 1124 | + * Sets the policy to be used in the response header. |
| 1125 | + * @param policy a permissions policy |
| 1126 | + * @return the {@link PermissionsPolicyConfig} for additional configuration |
| 1127 | + * @throws IllegalArgumentException if policy is null |
| 1128 | + */ |
| 1129 | + public PermissionsPolicyConfig policy(String policy) { |
| 1130 | + this.writer.setPolicy(policy); |
| 1131 | + return this; |
| 1132 | + } |
| 1133 | + |
| 1134 | + /** |
| 1135 | + * Allows completing configuration of Permissions Policy and continuing |
| 1136 | + * configuration of headers. |
| 1137 | + * @return the {@link HeadersConfigurer} for additional configuration |
| 1138 | + */ |
| 1139 | + public HeadersConfigurer<H> and() { |
| 1140 | + return HeadersConfigurer.this; |
| 1141 | + } |
| 1142 | + |
| 1143 | + } |
| 1144 | + |
1066 | 1145 | }
|
0 commit comments