Class StorageBackedSessionManager
- java.lang.Object
-
- net.shibboleth.utilities.java.support.component.AbstractInitializableComponent
-
- net.shibboleth.utilities.java.support.component.AbstractIdentifiedInitializableComponent
-
- net.shibboleth.utilities.java.support.component.AbstractIdentifiableInitializableComponent
-
- net.shibboleth.idp.session.impl.StorageBackedSessionManager
-
- All Implemented Interfaces:
SessionManager,SessionResolver,Component,DestructableComponent,IdentifiableComponent,IdentifiedComponent,InitializableComponent,Resolver<IdPSession,CriteriaSet>
public class StorageBackedSessionManager extends AbstractIdentifiableInitializableComponent implements SessionManager, SessionResolver
Implementation ofSessionManagerandSessionResolverinterfaces that relies on aStorageServicefor 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
IdPSessionrecord 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
AuthenticationResultis stored in a record keyed by the flow ID. The expiration is set based on the underlying flow's timeout.Each
SPSessionis 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 Classes Modifier and Type Class Description static classStorageBackedSessionManager.DefaultConsistentAddressConditionFactorySimplifies Spring wiring of a true/false condition for the consistentAddress feature.
-
Field Summary
Fields Modifier and Type Field Description private BiPredicate<String,String>consistentAddressConditionIndicates how bound session addresses and client addresses are compared.private CookieManagercookieManagerManages creation of cookies.private StringcookieNameName of cookie used to track sessions.protected static StringDEFAULT_COOKIE_NAMEDefault cookie name for session tracking.private Map<String,AuthenticationFlowDescriptor>flowDescriptorMapFlows that could potentially be used to authenticate the user.private javax.servlet.http.HttpServletRequesthttpRequestServlet request to read from.private javax.servlet.http.HttpServletResponsehttpResponseServlet response to write to.private IdentifierGenerationStrategyidGeneratorGenerator for XML ID attribute values.private org.slf4j.LoggerlogClass logger.private booleanmaskStorageFailureIndicates that storage service failures should be masked as much as possible.private booleansecondaryServiceIndexIndicates whether to secondary-index SPSessions.private StorageBackedIdPSessionSerializerserializerSerializer for sessions.static StringSESSION_PRIMARY_KEYStorage key of primary session records.private DurationsessionSlopAmount of time to defer expiration of records for better handling of logout.private DurationsessionTimeoutInactivity timeout for sessions.private SPSessionSerializerRegistryspSessionSerializerRegistryMappings between a SPSession type and a serializer implementation.private StorageServicestorageServiceThe back-end for managing data.private longstorageServiceThresholdSize boundary below which "large" data can't be stored.private booleantrackSPSessionsIndicates whether to store and track SPSessions.
-
Constructor Summary
Constructors Constructor Description StorageBackedSessionManager()Constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description IdPSessioncreateSession(String principalName)voiddestroySession(String sessionId, boolean unbind)protected voiddoInitialize()AuthenticationFlowDescriptorgetAuthenticationFlowDescriptor(String flowId)Get a matchingAuthenticationFlowDescriptor.BiPredicate<String,String>getConsistentAddressCondition()Get condition to evaluate bound session and client addresses for consistency.DurationgetSessionSlop()Get the amount of time to defer expiration of records.DurationgetSessionTimeout()Get the session inactivity timeout policy.SPSessionSerializerRegistrygetSPSessionSerializerRegistry()Get the attachedSPSessionSerializerRegistry.StorageSerializer<StorageBackedIdPSession>getStorageSerializer()Get the serializer for theIdPSessionobjects managed by this implementation.StorageServicegetStorageService()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.booleanisMaskStorageFailure()Get whether to mask StorageService failures where possible.booleanisSecondaryServiceIndex()Get whether to create a secondary index for SPSession lookup.booleanisTrackSPSessions()Get 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.Iterable<IdPSession>resolve(CriteriaSet criteria)IdPSessionresolveSingle(CriteriaSet criteria)voidsetAuthenticationFlowDescriptors(Iterable<AuthenticationFlowDescriptor> flows)Set 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.voidsetHttpServletRequest(javax.servlet.http.HttpServletRequest request)Set the servlet request to read from.voidsetHttpServletResponse(javax.servlet.http.HttpServletResponse response)Set the servlet response to write to.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.voidsetSPSessionSerializerRegistry(SPSessionSerializerRegistry registry)Set 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.booleanstorageServiceMeetsThreshold()Get 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.utilities.java.support.component.AbstractIdentifiableInitializableComponent
setId
-
Methods inherited from class net.shibboleth.utilities.java.support.component.AbstractIdentifiedInitializableComponent
getId
-
Methods inherited from class net.shibboleth.utilities.java.support.component.AbstractInitializableComponent
destroy, doDestroy, initialize, isDestroyed, isInitialized
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface net.shibboleth.utilities.java.support.component.IdentifiedComponent
getId
-
-
-
-
Field Detail
-
SESSION_PRIMARY_KEY
@Nonnull @NotEmpty public static final String SESSION_PRIMARY_KEY
Storage key of primary session records.- See Also:
- Constant Field Values
-
DEFAULT_COOKIE_NAME
@Nonnull @NotEmpty protected static final String DEFAULT_COOKIE_NAME
Default cookie name for session tracking.- See Also:
- Constant Field Values
-
log
@Nonnull private final org.slf4j.Logger log
Class logger.
-
httpRequest
@Nullable private javax.servlet.http.HttpServletRequest httpRequest
Servlet request to read from.
-
httpResponse
@Nullable private javax.servlet.http.HttpServletResponse httpResponse
Servlet response to write to.
-
sessionTimeout
@Nonnull private Duration sessionTimeout
Inactivity timeout for sessions.
-
sessionSlop
@Nonnull private Duration sessionSlop
Amount of time to defer expiration of records for better handling of logout.
-
maskStorageFailure
private boolean maskStorageFailure
Indicates that storage service failures should be masked as much as possible.
-
trackSPSessions
private boolean trackSPSessions
Indicates whether to store and track SPSessions.
-
secondaryServiceIndex
private boolean secondaryServiceIndex
Indicates whether to secondary-index SPSessions.
-
consistentAddressCondition
@Nonnull private BiPredicate<String,String> consistentAddressCondition
Indicates how bound session addresses and client addresses are compared.
-
cookieManager
@NonnullAfterInit private CookieManager cookieManager
Manages creation of cookies.
-
storageService
@NonnullAfterInit private StorageService storageService
The back-end for managing data.
-
storageServiceThreshold
private long storageServiceThreshold
Size boundary below which "large" data can't be stored.
-
idGenerator
@NonnullAfterInit private IdentifierGenerationStrategy idGenerator
Generator for XML ID attribute values.
-
serializer
@Nonnull private final StorageBackedIdPSessionSerializer serializer
Serializer for sessions.
-
flowDescriptorMap
@Nonnull @NonnullElements private final Map<String,AuthenticationFlowDescriptor> flowDescriptorMap
Flows that could potentially be used to authenticate the user.
-
spSessionSerializerRegistry
@Nullable private SPSessionSerializerRegistry spSessionSerializerRegistry
Mappings between a SPSession type and a serializer implementation.
-
-
Method Detail
-
setHttpServletRequest
public void setHttpServletRequest(@Nullable javax.servlet.http.HttpServletRequest request)Set the servlet request to read from.- Parameters:
request- servlet request
-
setHttpServletResponse
public void setHttpServletResponse(@Nullable javax.servlet.http.HttpServletResponse response)Set the servlet response to write to.- Parameters:
response- servlet response
-
getSessionTimeout
@Nonnull public Duration getSessionTimeout()
Get the session inactivity timeout policy.- Returns:
- inactivity timeout
-
setSessionTimeout
public void setSessionTimeout(@Nonnull Duration timeout)Set the session inactivity timeout policy.- Parameters:
timeout- the policy to set
-
getSessionSlop
@Nonnull public Duration getSessionSlop()
Get the amount of time to defer expiration of records.- Returns:
- expiration amount of time to defer expiration of records
-
setSessionSlop
public void setSessionSlop(@Nonnull Duration slop)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
@Nonnull public BiPredicate<String,String> 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
public void setConsistentAddressCondition(@Nonnull BiPredicate<String,String> condition)Set condition to evaluate bound session and client addresses for consistency.- Parameters:
condition- condition to set- Since:
- 4.0.0
-
setCookieName
public void setCookieName(@Nonnull @NotEmpty String name)
Set the cookie name to use for session tracking.- Parameters:
name- cookie name to use
-
setCookieManager
public void setCookieManager(@Nonnull CookieManager manager)Set theCookieManagerto use.- Parameters:
manager- the CookieManager to use.
-
getStorageService
@Nonnull public StorageService getStorageService()
Get theStorageServiceback-end to use.- Returns:
- the back-end to use
-
setStorageService
public void setStorageService(@Nonnull StorageService storage)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
-
setIDGenerator
public void setIDGenerator(@Nonnull IdentifierGenerationStrategy newIDGenerator)Set the generator to use when creating XML ID attribute values.- Parameters:
newIDGenerator- the new IdentifierGenerator to use
-
getStorageSerializer
@Nonnull public StorageSerializer<StorageBackedIdPSession> 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
-
setAuthenticationFlowDescriptors
public void setAuthenticationFlowDescriptors(@Nonnull @NonnullElements Iterable<AuthenticationFlowDescriptor> flows)
Set theAuthenticationFlowDescriptorcollection active in the system.- Parameters:
flows- the flows available for possible use
-
getSPSessionSerializerRegistry
@Nullable public SPSessionSerializerRegistry getSPSessionSerializerRegistry()
Get the attachedSPSessionSerializerRegistry.- Returns:
- a registry of SPSession class to serializer mappings
-
setSPSessionSerializerRegistry
public void setSPSessionSerializerRegistry(@Nullable SPSessionSerializerRegistry registry)Set theSPSessionSerializerRegistryto use.- Parameters:
registry- a registry of SPSession class to serializer mappings
-
doInitialize
protected void doInitialize() throws ComponentInitializationException- Overrides:
doInitializein classAbstractIdentifiedInitializableComponent- Throws:
ComponentInitializationException
-
createSession
@Nonnull public IdPSession createSession(@Nonnull @NotEmpty String principalName) throws SessionException
- Specified by:
createSessionin interfaceSessionManager- Throws:
SessionException
-
destroySession
public void destroySession(@Nonnull @NotEmpty String sessionId, boolean unbind) throws SessionException
- Specified by:
destroySessionin interfaceSessionManager- Throws:
SessionException
-
resolve
@Nonnull @NonnullElements public Iterable<IdPSession> resolve(@Nullable CriteriaSet criteria) throws ResolverException
- Specified by:
resolvein interfaceResolver<IdPSession,CriteriaSet>- Throws:
ResolverException
-
resolveSingle
@Nullable public IdPSession resolveSingle(@Nullable CriteriaSet criteria) throws ResolverException
- Specified by:
resolveSinglein interfaceResolver<IdPSession,CriteriaSet>- Throws:
ResolverException
-
indexBySPSession
protected void indexBySPSession(@Nonnull IdPSession idpSession, @Nonnull SPSession spSession, int attempts) throws SessionExceptionInsert 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 SessionExceptionRemove 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
@Nullable private IdPSession lookupBySessionId(@Nullable String sessionId) throws ResolverException
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 @NonnullElements 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
-
-