A base class of a principal provider implementing common tasks and a
caching facility. Extending classes should only deal with the retrieval of
Principals from their source, the caching of the principals is done
by this implementation.

getPrincipal

Returns the principal with the given name if is known to this provider
providePrincipal(String) is called, if no matching entry
is present in the cache.
NOTE: If the cache is enabled to contain negative entries (see
NEGATIVE_ENTRY_KEY configuration option), the cache will also
store negative matches (as null values) in the principal cache.