Class CombinedRealm
- java.lang.Object
-
- org.apache.catalina.util.LifecycleBase
-
- org.apache.catalina.util.LifecycleMBeanBase
-
- org.apache.catalina.realm.RealmBase
-
- org.apache.catalina.realm.CombinedRealm
-
- All Implemented Interfaces:
javax.management.MBeanRegistration,Contained,JmxEnabled,Lifecycle,Realm
- Direct Known Subclasses:
LockOutRealm
public class CombinedRealm extends RealmBase
Realm implementation that contains one or more realms. Authentication is attempted for each realm in the order they were configured. If any realm authenticates the user then the authentication succeeds. When combining realms user names should be unique across all combined realms.For the typical usage (create realms, add realms to container, start container), each realm will be registered with JMX and
RealmBase.getRealmPath()will match the JMX object name. For simple changes (remove a realm, add a new realm)RealmBase.getRealmPath()and the JMX object name will remain synchronized. For more unusual changes such as moving the realm to a new container, the JMX object names andRealmBase.getRealmPath()are very likely to end up out of sync. If there are naming conflicts it is possible for realms that are still in use to not be registered in JMX.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.apache.catalina.realm.RealmBase
RealmBase.AllRolesMode
-
Nested classes/interfaces inherited from interface org.apache.catalina.Lifecycle
Lifecycle.SingleUse
-
-
Field Summary
Fields Modifier and Type Field Description protected java.util.List<Realm>realmsThe list of Realms contained by this Realm.-
Fields inherited from class org.apache.catalina.realm.RealmBase
allRolesMode, container, containerLog, realmPath, sm, stripRealmForGss, support, USER_ATTRIBUTES_DELIMITER, USER_ATTRIBUTES_WILDCARD, userAttributes, userAttributesList, validate, x509UsernameRetriever, x509UsernameRetrieverClassName
-
Fields inherited from interface org.apache.catalina.Lifecycle
AFTER_DESTROY_EVENT, AFTER_INIT_EVENT, AFTER_START_EVENT, AFTER_STOP_EVENT, BEFORE_DESTROY_EVENT, BEFORE_INIT_EVENT, BEFORE_START_EVENT, BEFORE_STOP_EVENT, CONFIGURE_START_EVENT, CONFIGURE_STOP_EVENT, PERIODIC_EVENT, START_EVENT, STOP_EVENT
-
-
Constructor Summary
Constructors Constructor Description CombinedRealm()Default constructor for CombinedRealm.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddRealm(Realm realm)Add a realm to the list of realms that will be used to authenticate users.java.security.Principalauthenticate(java.lang.String username)Try to authenticate with the specified username.java.security.Principalauthenticate(java.lang.String username, java.lang.String credentials)Try to authenticate using the specified username and credentials.java.security.Principalauthenticate(java.lang.String username, java.lang.String clientDigest, java.lang.String nonce, java.lang.String nc, java.lang.String cnonce, java.lang.String qop, java.lang.String realmName, java.lang.String digestA2, java.lang.String algorithm)Try to authenticate with the specified username, which matches the digest calculated using the given parameters using the method described in RFC 7616.java.security.Principalauthenticate(java.security.cert.X509Certificate[] certs)Try to authenticate using a chain ofX509Certificates.java.security.Principalauthenticate(org.ietf.jgss.GSSContext gssContext, boolean storeCred)Try to authenticate using aGSSContext.java.security.Principalauthenticate(org.ietf.jgss.GSSName gssName, org.ietf.jgss.GSSCredential gssCredential)Try to authenticate using aGSSName.voidbackgroundProcess()Delegate the backgroundProcess call to all sub-realms.protected voiddestroyInternal()Ensure child Realms are destroyed when this Realm is destroyed.Realm[]getNestedRealms()Returns the array of Realm instances contained by this realm.protected java.lang.StringgetPassword(java.lang.String username)Get the password for the specified user.protected java.security.PrincipalgetPrincipal(java.lang.String username)Get the principal associated with the specified user.javax.management.ObjectName[]getRealms()Returns the JMX ObjectNames of the realms that this realm is wrapping.booleanhasRole(Wrapper wrapper, java.security.Principal principal, java.lang.String role)Check if the specified Principal has the specified security role, within the context of this Realm.booleanisAvailable()Return the availability of the realm for authentication.booleanremoveRealm(Realm realm)Remove a realm from the list of realms that are used to authenticate users.voidsetContainer(Container container)Set theContainerwith which this instance is associated.voidsetCredentialHandler(CredentialHandler credentialHandler)Set the CredentialHandler to be used by this Realm.voidsetRealmPath(java.lang.String theRealmPath)Set the path used in the JMX object name for this realm.protected voidstartInternal()Prepare for the beginning of active use of the public methods of this component and implement the requirements ofLifecycleBase.startInternal().protected voidstopInternal()Gracefully terminate the active use of the public methods of this component and implement the requirements ofLifecycleBase.stopInternal().-
Methods inherited from class org.apache.catalina.realm.RealmBase
addPropertyChangeListener, authenticate, findSecurityConstraints, getAllRolesMode, getContainer, getCredentialHandler, getDigest, getDigest, getDomainInternal, getObjectNameKeyProperties, getPrincipal, getPrincipal, getPrincipal, getRealmPath, getRealmSuffix, getServer, getTransportGuaranteeRedirectStatus, getUserAttributes, getValidate, getX509UsernameRetrieverClassName, hasMessageDigest, hasResourcePermission, hasRoleInternal, hasUserDataPermission, initInternal, isStripRealmForGss, main, parseUserAttributes, removePropertyChangeListener, setAllRolesMode, setStripRealmForGss, setTransportGuaranteeRedirectStatus, setUserAttributes, setValidate, setX509UsernameRetrieverClassName, toString
-
Methods inherited from class org.apache.catalina.util.LifecycleMBeanBase
getDomain, getObjectName, postDeregister, postRegister, preDeregister, preRegister, register, setDomain, unregister, unregister
-
Methods inherited from class org.apache.catalina.util.LifecycleBase
addLifecycleListener, destroy, findLifecycleListeners, fireLifecycleEvent, getState, getStateName, getThrowOnFailure, init, removeLifecycleListener, setState, setState, setThrowOnFailure, start, stop
-
-
-
-
Field Detail
-
realms
protected final java.util.List<Realm> realms
The list of Realms contained by this Realm.
-
-
Method Detail
-
addRealm
public void addRealm(Realm realm)
Add a realm to the list of realms that will be used to authenticate users.- Parameters:
realm- Realm which should be added to the combined realm
-
removeRealm
public boolean removeRealm(Realm realm)
Remove a realm from the list of realms that are used to authenticate users.- Parameters:
realm- Realm which should be removed from the combined realm- Returns:
trueif the realm was present and removed,falseotherwise
-
getRealms
public javax.management.ObjectName[] getRealms()
Returns the JMX ObjectNames of the realms that this realm is wrapping. Entries for realms that do not implement LifecycleMBeanBase will be null.- Returns:
- the array of realm ObjectNames, which may contain null entries
-
getNestedRealms
public Realm[] getNestedRealms()
Returns the array of Realm instances contained by this realm.- Returns:
- the array of nested realms
-
authenticate
public java.security.Principal authenticate(java.lang.String username, java.lang.String clientDigest, java.lang.String nonce, java.lang.String nc, java.lang.String cnonce, java.lang.String qop, java.lang.String realmName, java.lang.String digestA2, java.lang.String algorithm)Description copied from interface:RealmTry to authenticate with the specified username, which matches the digest calculated using the given parameters using the method described in RFC 7616.The default implementation calls
Realm.authenticate(String, String, String, String, String, String, String, String)for backwards compatibility which effectively forces the use of MD5 regardless of the algorithm specified in the call to this method.Implementations are expected to override the default implementation and take account of the algorithm parameter.
- Specified by:
authenticatein interfaceRealm- Overrides:
authenticatein classRealmBase- Parameters:
username- Username of the Principal to look upclientDigest- Digest which has been submitted by the clientnonce- Unique (or supposedly unique) token which has been used for this requestnc- the nonce countercnonce- the client chosen nonceqop- the "quality of protection" (ncandcnoncewill only be used, ifqopis notnull).realmName- Realm namedigestA2- Second digest calculated as digest(Method + ":" + uri)algorithm- The message digest algorithm to use- Returns:
- the associated principal, or
nullif there is none.
-
authenticate
public java.security.Principal authenticate(java.lang.String username)
Description copied from interface:RealmTry to authenticate with the specified username.- Specified by:
authenticatein interfaceRealm- Overrides:
authenticatein classRealmBase- Parameters:
username- Username of the Principal to look up- Returns:
- the associated principal, or
nullif none is associated.
-
authenticate
public java.security.Principal authenticate(java.lang.String username, java.lang.String credentials)Description copied from interface:RealmTry to authenticate using the specified username and credentials.- Specified by:
authenticatein interfaceRealm- Overrides:
authenticatein classRealmBase- Parameters:
username- Username of the Principal to look upcredentials- Password or other credentials to use in authenticating this username- Returns:
- the associated principal, or
nullif there is none
-
setContainer
public void setContainer(Container container)
Description copied from interface:ContainedSet theContainerwith which this instance is associated.- Specified by:
setContainerin interfaceContained- Overrides:
setContainerin classRealmBase- Parameters:
container- The Container instance with which this instance is to be associated, ornullto disassociate this instance from any Container
-
setRealmPath
public void setRealmPath(java.lang.String theRealmPath)
Set the path used in the JMX object name for this realm.Calling this method will also (re)set the paths for all of the nested realms. If a nested realm has been removed this will result in the remaining nested realms being re-numbered which may create an inconsistency between the nested realm's path and its JMX registration (if any).
- Overrides:
setRealmPathin classRealmBase- Parameters:
theRealmPath- The realm path to use
-
startInternal
protected void startInternal() throws LifecycleExceptionDescription copied from class:RealmBasePrepare for the beginning of active use of the public methods of this component and implement the requirements ofLifecycleBase.startInternal().- Overrides:
startInternalin classRealmBase- Throws:
LifecycleException- if this component detects a fatal error that prevents this component from being used
-
stopInternal
protected void stopInternal() throws LifecycleExceptionDescription copied from class:RealmBaseGracefully terminate the active use of the public methods of this component and implement the requirements ofLifecycleBase.stopInternal().- Overrides:
stopInternalin classRealmBase- Throws:
LifecycleException- if this component detects a fatal error that needs to be reported
-
destroyInternal
protected void destroyInternal() throws LifecycleExceptionEnsure child Realms are destroyed when this Realm is destroyed.- Overrides:
destroyInternalin classLifecycleMBeanBase- Throws:
LifecycleException- If the destruction fails
-
backgroundProcess
public void backgroundProcess()
Delegate the backgroundProcess call to all sub-realms.- Specified by:
backgroundProcessin interfaceRealm- Overrides:
backgroundProcessin classRealmBase
-
authenticate
public java.security.Principal authenticate(java.security.cert.X509Certificate[] certs)
Description copied from interface:RealmTry to authenticate using a chain ofX509Certificates.- Specified by:
authenticatein interfaceRealm- Overrides:
authenticatein classRealmBase- Parameters:
certs- Array of client certificates, with the first one in the array being the certificate of the client itself.- Returns:
- the associated principal, or
nullif there is none
-
authenticate
public java.security.Principal authenticate(org.ietf.jgss.GSSContext gssContext, boolean storeCred)Description copied from interface:RealmTry to authenticate using aGSSContext.- Specified by:
authenticatein interfaceRealm- Overrides:
authenticatein classRealmBase- Parameters:
gssContext- The gssContext processed by theAuthenticator.storeCred- Should the realm attempt to store the delegated credentials in the returned Principal?- Returns:
- the associated principal, or
nullif there is none
-
authenticate
public java.security.Principal authenticate(org.ietf.jgss.GSSName gssName, org.ietf.jgss.GSSCredential gssCredential)Description copied from interface:RealmTry to authenticate using aGSSName.- Specified by:
authenticatein interfaceRealm- Overrides:
authenticatein classRealmBase- Parameters:
gssName- TheGSSNameof the principal to look upgssCredential- TheGSSCredentialof the principal, may benull- Returns:
- the associated principal, or
nullif there is none
-
hasRole
public boolean hasRole(Wrapper wrapper, java.security.Principal principal, java.lang.String role)
Description copied from class:RealmBaseCheck if the specified Principal has the specified security role, within the context of this Realm.This method or
RealmBase.hasRoleInternal(Principal, String)can be overridden by Realm implementations, but the default is adequate when an instance ofGenericPrincipalis used to represent authenticated Principals from this Realm.- Specified by:
hasRolein interfaceRealm- Overrides:
hasRolein classRealmBase- Parameters:
wrapper- wrapper context for evaluating roleprincipal- Principal for whom the role is to be checkedrole- Security role to be checked- Returns:
trueif the specified Principal has the specified security role, within the context of this Realm; otherwise returnfalse.
-
getPassword
protected java.lang.String getPassword(java.lang.String username)
Description copied from class:RealmBaseGet the password for the specified user.- Specified by:
getPasswordin classRealmBase- Parameters:
username- The username- Returns:
- the password associated with the given principal's username.
-
getPrincipal
protected java.security.Principal getPrincipal(java.lang.String username)
Description copied from class:RealmBaseGet the principal associated with the specified user.- Specified by:
getPrincipalin classRealmBase- Parameters:
username- The username- Returns:
- the Principal associated with the given username.
-
isAvailable
public boolean isAvailable()
Description copied from interface:RealmReturn the availability of the realm for authentication.- Returns:
trueif the realm is able to perform authentication
-
setCredentialHandler
public void setCredentialHandler(CredentialHandler credentialHandler)
Description copied from interface:RealmSet the CredentialHandler to be used by this Realm.- Specified by:
setCredentialHandlerin interfaceRealm- Overrides:
setCredentialHandlerin classRealmBase- Parameters:
credentialHandler- theCredentialHandlerto use
-
-