11 changed files with 190 additions and 23 deletions
@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
|
||||
/* |
||||
* Copyright 2002-2022 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.security.core.context; |
||||
|
||||
import java.util.function.Supplier; |
||||
|
||||
/** |
||||
* An interface that allows delayed access to a {@link SecurityContext} that may be |
||||
* generated. |
||||
* |
||||
* @author Steve Riesenberg |
||||
* @since 5.8 |
||||
*/ |
||||
public interface DeferredSecurityContext extends Supplier<SecurityContext> { |
||||
|
||||
/** |
||||
* Returns true if {@link #get()} refers to a generated {@link SecurityContext} or |
||||
* false if it already existed. |
||||
* @return true if {@link #get()} refers to a generated {@link SecurityContext} or |
||||
* false if it already existed |
||||
*/ |
||||
boolean isGenerated(); |
||||
|
||||
} |
||||
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
/* |
||||
* Copyright 2002-2022 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.security.web.context; |
||||
|
||||
import java.util.function.Supplier; |
||||
|
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
|
||||
import org.springframework.core.log.LogMessage; |
||||
import org.springframework.security.core.context.DeferredSecurityContext; |
||||
import org.springframework.security.core.context.SecurityContext; |
||||
import org.springframework.security.core.context.SecurityContextHolderStrategy; |
||||
|
||||
/** |
||||
* @author Steve Riesenberg |
||||
* @since 5.8 |
||||
*/ |
||||
final class SupplierDeferredSecurityContext implements DeferredSecurityContext { |
||||
|
||||
private static final Log logger = LogFactory.getLog(SupplierDeferredSecurityContext.class); |
||||
|
||||
private final Supplier<SecurityContext> supplier; |
||||
|
||||
private final SecurityContextHolderStrategy strategy; |
||||
|
||||
private SecurityContext securityContext; |
||||
|
||||
private boolean missingContext; |
||||
|
||||
SupplierDeferredSecurityContext(Supplier<SecurityContext> supplier, SecurityContextHolderStrategy strategy) { |
||||
this.supplier = supplier; |
||||
this.strategy = strategy; |
||||
} |
||||
|
||||
@Override |
||||
public SecurityContext get() { |
||||
init(); |
||||
return this.securityContext; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isGenerated() { |
||||
init(); |
||||
return this.missingContext; |
||||
} |
||||
|
||||
private void init() { |
||||
if (this.securityContext != null) { |
||||
return; |
||||
} |
||||
|
||||
this.securityContext = this.supplier.get(); |
||||
this.missingContext = (this.securityContext == null); |
||||
if (this.missingContext) { |
||||
this.securityContext = this.strategy.createEmptyContext(); |
||||
if (logger.isTraceEnabled()) { |
||||
logger.trace(LogMessage.format("Created %s", this.securityContext)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue