There seems to be good documentation for configuring Realms. I currently have a JAASRealm working by implementing a javax.security.auth.spi.LoginModule
I have found very little documentation for custom Authenticators. Your _outline_ is helpful, but I am still struggling. My class which extends org.apache.catalina.authenticator.BasicAuthenticator contains: org.apache.catalina.Realm realm = context.getRealm(); log.trace( "Info: " + realm.getInfo() ); The logs are outputting "Info: org.apache.catalina.realm.RealmBase/1.0" Any clue on how to get it to use "org.apache.catalina.realm.JAASRealm/1.0" ? My web.xml still contains <login-config> <auth-method>BASIC</auth-method> <realm-name>CUSTOMRealm</realm-name> </login-config> Thanks for any insight or pointers to documentation on Authenticators. -Steve More On 9/26/07, Edwin K. Brown wrote: > I'm doing this to provide an _outline_ of what is needed to be done to get > CLIENT-CERT authentication and authorization working in Tomcat 6. This is > high level because each implementation will have to be done to suit your own > needs. > > > > This first part deals with the JAAS related code that you have to create: > > > > * The Tomcat documentation states that the > org.apache.catalina.realm.JAASRealm has to be used to get this working. > Actually, the JAASRealm should be extended or you create a class that extends > org.apache.catalina.realm.RealmBase. For purposes of this post, lets call > this class CertJASSRealm. > * In CertJASSRealm, the authenticate(X509Certificate certs[]) method > needs to be over-ridden/implemented to perform the certificate validation. > * In CertJASSRealm, the getPrincipal(String username) and > getPrincipal(String username, String subject) methods needs to be > over-ridden/implemented to create the principal. > * The Tomcat documentation states that it is best to implement your own > Role and User class, and that is definitively the case! > * Create a class to handle the role. > * Create a class to handle the user. This seems to be one of the keys > to getting this right. Let's call this class CertJASSUser. The getRoles() > method needs to be implemented to retrieve the roles associated with this > user. In the "demo" that I did, I had this return a set array of roles. I > imagine in "the real world," this would go to some external source like LDAP, > a database, or a file, to retrieve roles, if any, for the user. > * In CertJAASUser, implement hasRole(String role) that determines if > the user has the role name passed in. > * Implement a LoginModule class and a CallbackHandler class to the JAAS > specification to suit your needs. > * Let's call the CallbackHandler class CertCallbackHandler. I created a > method that sets the certificates, public void setCerts(X509Certificate[] > certs), for use later on during the login() process. > * Let's call the LoginModule implementation CertLoginModule. The > initialize(Subject, CallbackHandler, Map, Map) method should do any > initialization needed. The login() method should do the "login" using the > certificates from the CertCallbackHandler object. > * Make sure you create the JAAS configuration file. The name of the > module in this example is CertJaas. > > > > This second part deals with SSL authentication. This has to make it possible > to get the authentication with certificates: > > * Create a class that extends > org.apache.catalina.authenticator.AuthenticatorBase. Let's call this class > CertSSLAuthenticator > * Implement authenticate(Request request, Response response, > LoginConfig config). The TOMCAT class SSLAuthenticator is a good class to use > as a model for what to do for the authentication process. I think CRL lookup > or OCSP could be used in this method. > > > > > > This third part deals with what you have to do to get TOMCAT to recognize > that you have JAASRelam code that you want to be used instead of what TOMCAT > provides. Please note that JAASRealm is the ONLY JAAS implementation that > TOMCAT will recognize "out of the box" without make the following changes. > Believe me, if you don't do the following, you will NOT get it working > properly. You will have to extract, modify, and replace some files in > catalina.jar. > > * Make a copy of catalina.jar. > * Extract org/apache/catalina/authenticator/mbeans-descriptors.xml > * Copy the mbean tag with attribute name "SSLAuthenticator". > * Change the name attribute to the name of the file you created to do > the SSL authentication in the second part. In this case, the name would be > CertSSLAuthenticator. > * Modify the type attribute to the full class name of the SSL > authenticator class. > * Save the file and replace it in the catalina jar. > * Extract org/apache/catalina/startup/Authenticators.properties > * There is an entry for CLIENT-CERT: > CLIENT-CERT=org.apache.catalina.authenticator.SSLAuthenticator. Change the > class name to the class of the SSL authenticator class created. In this case, > CertSSLAuthenticator. > * Save the file and replace it in catalina.jar > > > > The above was done because by default, TOMCAT uses it's own files and no > matter how you override things, your own code doesn't get called. > > > > > > The fourth part deals with the server.xml configuration. > > * The for the realm, an example would be as follows: > > <Realm classname="example.CertJAASRealm" appName="CertJass" > userClassNames="example.CertJASSUser" > > roleClassNames="example.CertJASSRole" resourceName="CertJass" /> > > > > > > That is an outline of what I did to get it working. I'm sending this so that > Google will find it and give it as a _possible_ way of getting it done. It > appears to me that the TOMCAT team could make this a lot easier to do. > > > > Ed Brown > Senior Software Architect > Vision Systems & Technology, Inc. > > ________________________________ > > 6021 University Boulevard, Suite 360 ▪ Ellicott City ▪ Maryland ▪ 21043 > Tel: 443.283.0135 ▪ Fax: 410.418.8580 > Email: [EMAIL PROTECTED] > Web: http://www.vsticorp.com/ > > > >