All,

We (somewhat) recently introduced the CredentialHandler to Tomcat in
order to make it easier to use different password-munging strategies
along with all the Realm implementations. A good example is using a hash
like SHA-256 in one case (using MessageDigest) and using PBKDF2 in
another case (using SecreyKey, etc.). In the past, we had been limited
to whatever the MessageDigest class could support, and we have a nice,
flexible system, now.

This is great for authentication against data already stored somewhere
e.g. a relational database. But it currently does not have an obviously
usable component for an application.

Yes, you can drop catalina.jar into your application's lib directory and
then you can do this:

        SecretKeyCredentialHandler ch = new SecretKeyCredentialHandler();

        ch.setAlgorithm(ALGORITHM);
        ch.setIterations(ITERATIONS);
        ch.setSaltLength(SALT_LENGTH);;
        ch.setKeyLength(KEY_LENGTH);

        hashedPassword = ch.mutate(user.getPassword());

... but there are two downsides to this:

1. The whole of catalina.jar is included in your application, possibly
   breaking a great many things
2. You have to make sure that all of the values match whatever you have
   configured in your <CredentialHandler> element in context.xml
   (or server.xml)

To solve the first problem, I'm wondering if we could produce an
artifact during the build that just contains the interfaces, etc. for
the CredentialHandlers. This would allow users to build against them and
even lazily deploy them with their code.

For the second issue, I don't see any opportunities at present.

It doesn't look like the application's Realms are available via JMX if
they are declared local to the application -- only the global Realms are
represented by MBeans. Also, it doesn't look like the Realms offer
access to the CredentialHandlers even if they were available.

I think these are two oversights that ought to be corrected: local
Realms ought to be locatable via JMX just as local DataSources are
available in e.g.
Catalina:type=DataSource,host=[host],context=/[context-path],class=javax.sql.DataSource,name="[name]"
and also Realms ought to expose information about their CredentialHandlers.

If those are available, then applications can simply grab the same
CredentialHandler that Tomcat is using for authentication and use it for
two obvious use-cases I can think of:

1. Preparing new credentials for saving to the user data store (e.g.
   registration, change-password, etc.)
2. Verifying existing credentials without Tomcat performing
   authentication (e.g. check-password required to update account
   info, inspect password history to prohibit repeats, etc.)

The only caveat is that the application definitely would not be able to
deploy either catalina.jar or catalina-only-credential-handlers.jar,
otherwise they'll get ClassCastExceptions when they try to use them. But
that's okay: documentation can take care of that to some degree.

Does anyone have any thoughts on any of those items? I'd really like for
applications to be able to re-use those components if possible.

Thanks,
-chris

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to