Package net.shibboleth.idp.authn.impl
Class StorageBackedAccountLockoutManager
java.lang.Object
net.shibboleth.shared.component.AbstractInitializableComponent
net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent
net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent
net.shibboleth.idp.authn.impl.StorageBackedAccountLockoutManager
- All Implemented Interfaces:
AccountLockoutManager,EnumeratableAccountLockoutManager,Component,DestructableComponent,IdentifiableComponent,IdentifiedComponent,InitializableComponent
public class StorageBackedAccountLockoutManager
extends AbstractIdentifiableInitializableComponent
implements EnumeratableAccountLockoutManager
Implementation of
EnumeratableAccountLockoutManager interface that relies on a StorageService
to track lockout state.-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classA function to generate a key for lockout storage. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate Function<ProfileRequestContext,Duration> Lookup function for interval after which counter is reset.private booleanControls whether attempts against locked accounts extend duration.private Function<ProfileRequestContext,Duration> Lookup function for duration of lockout.private Function<ProfileRequestContext,String> Lookup function to produce account lockout keys.private org.slf4j.LoggerClass logger.private Function<ProfileRequestContext,Integer> Lookup function for maximum failed attempts within window.private StorageServiceBacking service. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionbooleancheck(ProfileRequestContext profileRequestContext) Check if the authentication credentials associated with the request are subject to lockout.booleanclear(ProfileRequestContext profileRequestContext) Clear the lockout state for the authentication credentials associated with the request.protected booleandoCheck(ProfileRequestContext profileRequestContext, String key, int maxAttempts, long lockoutDuration, long counterInterval, boolean increment) Helper method to perform a check operation against a specific key.protected booleandoIncrement(ProfileRequestContext profileRequestContext, String key, int retries, long lockoutDuration, long counterInterval) Implement invalid login attempt counter via storage service, retrying as necessary.protected voidenumerate(ProfileRequestContext profileRequestContext) Return iterable collection of locked out keys that match a supplied partial key (i.e., are prefixed by it).private Function<ProfileRequestContext,String> Guaranteed non null value forlockoutKeyStrategy.booleanincrement(ProfileRequestContext profileRequestContext) Increment the lockout counter for the authentication credentials associated with the request.voidsetCounterInterval(Duration window) Set interval after which counter is reset.voidSet lookup function for interval after which counter is reset.voidsetExtendLockoutDuration(boolean flag) Set whether to extend the lockout duration on attempts during lockout.voidsetLockoutDuration(Duration duration) Set lockout duration.voidSet lookup function for lockout duration.voidsetLockoutKeyStrategy(Function<ProfileRequestContext, String> strategy) Set the strategy function to compute the account lockout key.voidsetMaxAttempts(int attempts) Set the maximum failed attempts within window.voidSet lookup function for maximum failed attempts within window.voidsetStorageService(StorageService storage) Set theStorageServiceback-end to use.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
-
log
@Nonnull private org.slf4j.Logger logClass logger. -
storageService
Backing service. -
lockoutKeyStrategy
Lookup function to produce account lockout keys. -
maxAttemptsLookupStrategy
Lookup function for maximum failed attempts within window. -
counterIntervalLookupStrategy
Lookup function for interval after which counter is reset. -
lockoutDurationLookupStrategy
Lookup function for duration of lockout. -
extendLockoutDuration
private boolean extendLockoutDurationControls whether attempts against locked accounts extend duration.
-
-
Constructor Details
-
StorageBackedAccountLockoutManager
public StorageBackedAccountLockoutManager()Constructor.
-
-
Method Details
-
setStorageService
Set theStorageServiceback-end to use.- Parameters:
storage- the back-end to use
-
setLockoutKeyStrategy
Set the strategy function to compute the account lockout key.Defaults to a concatenation of the username and client address.
- Parameters:
strategy- strategy function
-
setMaxAttempts
Set the maximum failed attempts within window.Defaults to 5.
- Parameters:
attempts- maximum failed attempts
-
setMaxAttemptsLookupStrategy
Set lookup function for maximum failed attempts within window.The function MUST return a positive value.
- Parameters:
strategy- lookup function
-
setCounterInterval
Set interval after which counter is reset.Defaults to 5 minutes.
- Parameters:
window- counter window
-
setCounterIntervalLookupStrategy
public void setCounterIntervalLookupStrategy(@Nonnull Function<ProfileRequestContext, Duration> strategy) Set lookup function for interval after which counter is reset.The function MUST return a positive value.
- Parameters:
strategy- lookup function
-
setLockoutDuration
Set lockout duration.Defaults to 5 minutes.
- Parameters:
duration- lockout duration
-
setLockoutDurationLookupStrategy
public void setLockoutDurationLookupStrategy(@Nonnull Function<ProfileRequestContext, Duration> strategy) Set lookup function for lockout duration.The function MUST return a positive value. Use a large value for permanent lockout.
- Parameters:
strategy- lookup function
-
setExtendLockoutDuration
public void setExtendLockoutDuration(boolean flag) Set whether to extend the lockout duration on attempts during lockout.- Parameters:
flag- flag to set
-
doInitialize
- Overrides:
doInitializein classAbstractIdentifiedInitializableComponent- Throws:
ComponentInitializationException
-
getLockoutKeyStrategy
Guaranteed non null value forlockoutKeyStrategy. We check for non-nullness indoInitialize()so it suffices to check Component state.- Returns:
- a null-safe
lockoutKeyStrategy
-
check
Check if the authentication credentials associated with the request are subject to lockout.- Specified by:
checkin interfaceAccountLockoutManager- Parameters:
profileRequestContext- current profile request context- Returns:
- true iff the credentials correspond to a locked account
-
increment
Increment the lockout counter for the authentication credentials associated with the request.- Specified by:
incrementin interfaceAccountLockoutManager- Parameters:
profileRequestContext- current profile request context- Returns:
- true iff the counter was incremented
-
clear
Clear the lockout state for the authentication credentials associated with the request.- Specified by:
clearin interfaceAccountLockoutManager- Parameters:
profileRequestContext- current profile request context- Returns:
- true iff the state was successfully cleared
-
enumerate
Return iterable collection of locked out keys that match a supplied partial key (i.e., are prefixed by it).The key MUST be supplied via a
LockoutManagerContextsubcontext of the input context.- Specified by:
enumeratein interfaceEnumeratableAccountLockoutManager- Parameters:
profileRequestContext- current profile request context- Returns:
- the locked out keys, or a null if an error occurs
-
doCheck
protected boolean doCheck(@Nonnull ProfileRequestContext profileRequestContext, @Nonnull String key, int maxAttempts, long lockoutDuration, long counterInterval, boolean increment) Helper method to perform a check operation against a specific key.- Parameters:
profileRequestContext- current profile request contextkey- input key to checkmaxAttempts- maximum allowable attempts before lockoutlockoutDuration- duration of lockoutcounterInterval- interval before disregarding attemptsincrement- whether to increment the counter if already locked out- Returns:
- true iff the designated key is locked out
-
doIncrement
protected boolean doIncrement(@Nonnull ProfileRequestContext profileRequestContext, @Nonnull @NotEmpty String key, int retries, long lockoutDuration, long counterInterval) Implement invalid login attempt counter via storage service, retrying as necessary.- Parameters:
profileRequestContext- current profile request contextkey- account lockout keyretries- number of additional retries to allowlockoutDuration- duration of lockoutcounterInterval- interval before disregarding attempts- Returns:
- true iff successful
-