Class StorageBackedSessionManager
- All Implemented Interfaces:
SessionManager,SessionResolver,Component,DestructableComponent,IdentifiableComponent,IdentifiedComponent,InitializableComponent,Resolver<IdPSession,CriteriaSet>
SessionManager and SessionResolver interfaces that relies on a
StorageService for persistence and lifecycle management of data.
The storage layout here is to store most data in a context named for the session ID. Within that context, the
IdPSession record lives under a key called "_session", with an expiration based on the session timeout value
plus a configurable amount of "slop" to prevent premature disappearance in case of logout.
Each AuthenticationResult is stored in a record keyed by the flow ID. The expiration
is set based on the underlying flow's timeout.
Each SPSession is stored in a record keyed by the service ID. The expiration is set based on the SPSession's
own expiration plus the "slop" value.
For cross-referencing, lists of flow and service IDs are tracked within the "_session" record, so adding either requires an update to that record plus the creation of a new one. Post-creation, there are no updates to the AuthenticationResult or SPSession records, but the expiration of the result records can be updated to reflect activity updates.
When a SPSession is added, it may expose an optional secondary "key". If set, this is a signal to add a secondary lookup of the SPSession. This is a record containing a list of relevant IdPSession IDs stored under a context/key pair consisting of the Service ID and the exposed secondary key from the object. The expiration of this record is set based on the larger of the current list expiration, if any, and the expiration of the SPSession plus the configured slop value. In other words, the lifetime of the index record is pushed out as far as needed to avoid premature expiration while any of the SPSessions producing it remain around.
The primary purpose of the secondary list is SAML logout, and is an optional feature that can be disabled. In the case of a SAML 2 session, the secondary key is some form of the NameID issued to the service.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classSimplifies Spring wiring of a true/false condition for the consistentAddress feature. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate BiPredicate<String,String> Indicates how bound session addresses and client addresses are compared.private CookieManagerManages creation of cookies.private StringName of cookie used to track sessions.protected static final StringDefault cookie name for session tracking.private final Map<String,AuthenticationFlowDescriptor> Flows that could potentially be used to authenticate the user.private NonnullSupplier<HttpServletRequest>Servlet request to read from.private IdentifierGenerationStrategyGenerator for XML ID attribute values.private final org.slf4j.LoggerClass logger.private booleanIndicates that storage service failures should be masked as much as possible.private booleanIndicates whether to secondary-index SPSessions.private final StorageBackedIdPSessionSerializerSerializer for sessions.static final StringStorage key of primary session records.private DurationAmount of time to defer expiration of records for better handling of logout.private DurationInactivity timeout for sessions.private SPSessionSerializerRegistryMappings between a SPSession type and a serializer implementation.private StorageServiceThe back-end for managing data.private longSize boundary below which "large" data can't be stored.private booleanIndicates whether to store and track SPSessions. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptioncreateSession(String principalName) Create and return a newIdPSessionobject for a subject.voiddestroySession(String sessionId, boolean unbind) Invalidates or otherwise removes a session from persistent storage and/or unbinds it from a client.protected voidGet a matchingAuthenticationFlowDescriptor.Get condition to evaluate bound session and client addresses for consistency.private HttpServletRequestGet theHttpServletRequestassociated with this operation.Get the amount of time to defer expiration of records.Get the session inactivity timeout policy.Get the attachedSPSessionSerializerRegistry.Get the serializer for theIdPSessionobjects managed by this implementation.Get theStorageServiceback-end to use.protected voidindexBySPSession(IdPSession idpSession, SPSession spSession, int attempts) Insert or update a secondary index record from an SPSession to a parent IdPSession.booleanGet whether to mask StorageService failures where possible.booleanGet whether to create a secondary index for SPSession lookup.booleanGet whether to track SPSessions.private IdPSessionlookupBySessionId(String sessionId) Performs a lookup and deserializes a record based on session ID.private Iterable<IdPSession>lookupBySPSession(SPSessionCriterion criterion) Performs a lookup and deserializes records potentially matching a SPSession.resolve(CriteriaSet criteria) resolveSingle(CriteriaSet criteria) voidSet theAuthenticationFlowDescriptorcollection active in the system.voidsetConsistentAddress(boolean flag) Set whether sessions are bound to client addresses either via disabling the comparison or testing simple equality.voidsetConsistentAddressCondition(BiPredicate<String, String> condition) Set condition to evaluate bound session and client addresses for consistency.voidsetCookieManager(CookieManager manager) Set theCookieManagerto use.voidsetCookieName(String name) Set the cookie name to use for session tracking.voidsetHttpServletRequestSupplier(NonnullSupplier<HttpServletRequest> requestSupplier) Set theNonnullSupplierfor the servlet request to read from.voidsetIDGenerator(IdentifierGenerationStrategy newIDGenerator) Set the generator to use when creating XML ID attribute values.voidsetMaskStorageFailure(boolean flag) Set whether to mask StorageService failures where possible.voidsetSecondaryServiceIndex(boolean flag) Set whether to create a secondary index for SPSession lookup.voidsetSessionSlop(Duration slop) Set the amount of time to defer expiration of records.voidsetSessionTimeout(Duration timeout) Set the session inactivity timeout policy.voidSet theSPSessionSerializerRegistryto use.voidsetStorageService(StorageService storage) Set theStorageServiceback-end to use.voidsetStorageServiceThreshold(long size) Set the size in characters that the configuredStorageServicemust support in order for "larger" data to be stored, specifically the data involved with thetrackSPSessionsandsecondaryServiceIndexoptions.voidsetTrackSPSessions(boolean flag) Set whether to track SPSessions.booleanGet whether the configuredStorageService'sStorageCapabilities.getValueSize()method meets the value set viasetStorageServiceThreshold(long).protected voidunindexSPSession(IdPSession idpSession, SPSession spSession, int attempts) Remove or update a secondary index record from an SPSession to a parent IdPSession.Methods inherited from class net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent
setIdMethods inherited from class net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent
ensureId, getId, ifDestroyedThrowDestroyedComponentException, ifInitializedThrowUnmodifiabledComponentException, ifNotInitializedThrowUninitializedComponentExceptionMethods inherited from class net.shibboleth.shared.component.AbstractInitializableComponent
checkComponentActive, checkSetterPreconditions, destroy, doDestroy, initialize, isDestroyed, isInitializedMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface net.shibboleth.shared.component.IdentifiedComponent
getId
-
Field Details
-
SESSION_PRIMARY_KEY
Storage key of primary session records.- See Also:
-
DEFAULT_COOKIE_NAME
Default cookie name for session tracking.- See Also:
-
log
@Nonnull private final org.slf4j.Logger logClass logger. -
httpRequestSupplier
Servlet request to read from. -
sessionTimeout
Inactivity timeout for sessions. -
sessionSlop
Amount of time to defer expiration of records for better handling of logout. -
maskStorageFailure
private boolean maskStorageFailureIndicates that storage service failures should be masked as much as possible. -
trackSPSessions
private boolean trackSPSessionsIndicates whether to store and track SPSessions. -
secondaryServiceIndex
private boolean secondaryServiceIndexIndicates whether to secondary-index SPSessions. -
consistentAddressCondition
Indicates how bound session addresses and client addresses are compared. -
cookieManager
Manages creation of cookies. -
cookieName
Name of cookie used to track sessions. -
storageService
The back-end for managing data. -
storageServiceThreshold
private long storageServiceThresholdSize boundary below which "large" data can't be stored. -
idGenerator
Generator for XML ID attribute values. -
serializer
Serializer for sessions. -
flowDescriptorMap
Flows that could potentially be used to authenticate the user. -
spSessionSerializerRegistry
Mappings between a SPSession type and a serializer implementation.
-
-
Constructor Details
-
StorageBackedSessionManager
public StorageBackedSessionManager()Constructor.
-
-
Method Details
-
getSessionTimeout
Get the session inactivity timeout policy.- Returns:
- inactivity timeout
-
setSessionTimeout
Set the session inactivity timeout policy.- Parameters:
timeout- the policy to set
-
getSessionSlop
Get the amount of time to defer expiration of records.- Returns:
- expiration amount of time to defer expiration of records
-
setSessionSlop
Set the amount of time to defer expiration of records.- Parameters:
slop- amount of time to defer expiration of records
-
isMaskStorageFailure
public boolean isMaskStorageFailure()Get whether to mask StorageService failures where possible.- Returns:
- true iff StorageService failures should be masked
-
setMaskStorageFailure
public void setMaskStorageFailure(boolean flag) Set whether to mask StorageService failures where possible.- Parameters:
flag- flag to set
-
isTrackSPSessions
public boolean isTrackSPSessions()Get whether to track SPSessions.- Returns:
- true iff SPSessions should be persisted
-
setTrackSPSessions
public void setTrackSPSessions(boolean flag) Set whether to track SPSessions.This feature requires a StorageService that is not client-side because of space limitations.
- Parameters:
flag- flag to set
-
isSecondaryServiceIndex
public boolean isSecondaryServiceIndex()Get whether to create a secondary index for SPSession lookup.- Returns:
- true iff a secondary index for SPSession lookup should be maintained
-
setSecondaryServiceIndex
public void setSecondaryServiceIndex(boolean flag) Set whether to create a secondary index for SPSession lookup.This feature requires a StorageService that is not client-side.
- Parameters:
flag- flag to set
-
getConsistentAddressCondition
Get condition to evaluate bound session and client addresses for consistency.- Returns:
- condition
- Since:
- 4.0.0
-
setConsistentAddress
public void setConsistentAddress(boolean flag) Set whether sessions are bound to client addresses either via disabling the comparison or testing simple equality.- Parameters:
flag- flag to set
-
setConsistentAddressCondition
Set condition to evaluate bound session and client addresses for consistency.- Parameters:
condition- condition to set- Since:
- 4.0.0
-
setCookieName
Set the cookie name to use for session tracking.- Parameters:
name- cookie name to use
-
getStorageService
Get theStorageServiceback-end to use.- Returns:
- the back-end to use
-
setStorageService
Set theStorageServiceback-end to use.- Parameters:
storage- the back-end to use
-
storageServiceMeetsThreshold
public boolean storageServiceMeetsThreshold()Get whether the configuredStorageService'sStorageCapabilities.getValueSize()method meets the value set viasetStorageServiceThreshold(long).- Returns:
- true iff the threshold is met
-
setStorageServiceThreshold
public void setStorageServiceThreshold(long size) Set the size in characters that the configuredStorageServicemust support in order for "larger" data to be stored, specifically the data involved with thetrackSPSessionsandsecondaryServiceIndexoptions.The implementation will query the configured service each time it needs to honor those options, to handle cases where the size limit can vary by request.
Defaults to 1024 * 1024 characters.
- Parameters:
size- size in characters
-
getStorageSerializer
Get the serializer for theIdPSessionobjects managed by this implementation.- Returns:
- the serializer to use when writing back session objects
-
getAuthenticationFlowDescriptor
@Nullable public AuthenticationFlowDescriptor getAuthenticationFlowDescriptor(@Nonnull @NotEmpty String flowId) Get a matchingAuthenticationFlowDescriptor.- Parameters:
flowId- the ID of the flow to return- Returns:
- the matching flow descriptor, or null
-
getHttpRequest
Get theHttpServletRequestassociated with this operation.- Returns:
- the
HttpServletRequest
-
setAuthenticationFlowDescriptors
Set theAuthenticationFlowDescriptorcollection active in the system.- Parameters:
flows- the flows available for possible use
-
getSPSessionSerializerRegistry
Get the attachedSPSessionSerializerRegistry.- Returns:
- a registry of SPSession class to serializer mappings
-
setSPSessionSerializerRegistry
Set theSPSessionSerializerRegistryto use.- Parameters:
registry- a registry of SPSession class to serializer mappings
-
doInitialize
- Overrides:
doInitializein classAbstractIdentifiedInitializableComponent- Throws:
ComponentInitializationException
-
createSession
@Nonnull public IdPSession createSession(@Nonnull @NotEmpty String principalName) throws SessionException Create and return a newIdPSessionobject for a subject.Implementations may perform additional work to persist or associate the session with the client.
- Specified by:
createSessionin interfaceSessionManager- Parameters:
principalName- canonical name of the subject of the session- Returns:
- the newly created session
- Throws:
SessionException- if the session cannot be created
-
destroySession
public void destroySession(@Nonnull @NotEmpty String sessionId, boolean unbind) throws SessionException Invalidates or otherwise removes a session from persistent storage and/or unbinds it from a client.After calling this method, no further method calls on a corresponding
IdPSessionobject that may be in hand are guaranteed to function correctly. Their behavior is unspecified.- Specified by:
destroySessionin interfaceSessionManager- Parameters:
sessionId- the unique ID of the session to destroyunbind- whether the session should be unbound from the client- Throws:
SessionException- if the session cannot be destroyed
-
indexBySPSession
protected void indexBySPSession(@Nonnull IdPSession idpSession, @Nonnull SPSession spSession, int attempts) throws SessionException Insert or update a secondary index record from an SPSession to a parent IdPSession.- Parameters:
idpSession- the parent sessionspSession- the SPSession to indexattempts- number of times to retry operation in the event of a synchronization issue- Throws:
SessionException- if a fatal error occurs
-
unindexSPSession
protected void unindexSPSession(@Nonnull IdPSession idpSession, @Nonnull SPSession spSession, int attempts) throws SessionException Remove or update a secondary index record from an SPSession to a parent IdPSession.- Parameters:
idpSession- the parent sessionspSession- the SPSession to de-indexattempts- number of times to retry operation in the event of a synchronization issue- Throws:
SessionException- if a fatal error occurs
-
lookupBySessionId
Performs a lookup and deserializes a record based on session ID.- Parameters:
sessionId- the session to lookup- Returns:
- the IdPSession object, or null
- Throws:
ResolverException- if an error occurs during lookup
-
lookupBySPSession
@Nonnull private Iterable<IdPSession> lookupBySPSession(@Nonnull SPSessionCriterion criterion) throws ResolverException Performs a lookup and deserializes records potentially matching a SPSession.- Parameters:
criterion- the SPSessionCriterion to apply- Returns:
- collection of zero or more sessions
- Throws:
ResolverException- if an error occurs during lookup