As explained in the previous section, the TokenProvider interface has a method that takes a realm parameter:
boolean canHandleToken(String tokenType, String realm)- Whether this TokenProvider implementation can provide a token of the given type, in the given realm
In other words, the TokenProvider implementation is being asked whether it can supply a token corresponding to the Token Type in a particular realm. How the STS knows what the desired realm is will be covered subsequently. However, we will explain how the realm is handled by the TokenProviders here. The SCTProvider ignores the realm in the canHandleToken method. In other words, the SCTProvider can issue a SecurityContextToken in any realm. If a realm is passed through via the TokenProviderParameters when creating the token, the SCTProvider will cache the token with the associated realm as a property.
Unlike the SCTProvider, the SAMLTokenProvider does not ignore the realm parameter to the
canHandleToken method. Recall that the SAMLTokenProvider has a property
"Map<String, SAMLRealm> realmMap". The
canHandleToken method checks to
see if the given realm is null, and if it is not null then the realmMap must contain a
key which matches the given realm. So if the STS implementation is designed to issue
tokens in different realms, then the realmMap of the SAMLTokenProvider must contain
the corresponding realms in the key-set of the map.
The realmMap property maps realm Strings to SAMLRealm objects. Among other properties, the SAMLRealm class contains the following settings:
String issuer - the Issuer String to use in this realm
String signatureAlias - the keystore alias to use to retrieve the private key the SAMLTokenProvider uses to sign the generated token
If the SAMLTokenProvider is "realm aware", then it can issue tokens with an issuer name and signing key specific to a given realm. SAMLRealms also contain cryptographic and CallbackHandler settings to allow for configuring realm-specific keystores if desired. If no realm is passed to the SAMLTokenProvider, then these properties are obtained from the "system wide" properties defined in the STSPropertiesMBean object passed as part of the TokenProviderParameters, which can be set via the following methods:
void setSignatureUsername(String signatureUsername)
void setIssuer(String issuer)
Two additional properties are required when signing SAML Tokens. A password is required to access the private key in the keystore, which is supplied by a CallbackHandler instance. A WSS4J "Crypto" instance is also required which controls access to the keystore. These are both set on the STSPropertiesMBean object via:
void setCallbackHandler(CallbackHandler callbackHandler)
void setSignatureCrypto(Crypto signatureCrypto)
Note that the signature of generated SAML Tokens can be disabled, by setting the "signToken" property of the SAMLTokenProvider to "false". As per the SCTProvider, the generated SAML tokens are stored in the cache with the associated realm stored as a property.