markt 2004/11/22 14:42:30
Modified: catalina/src/share/org/apache/catalina/realm JDBCRealm.java
LocalStrings.properties
webapps/docs changelog.xml realm-howto.xml
Log:
Add support for DIGEST authentication to the JDBCRealm
Revision Changes Path
1.9 +126 -69
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/JDBCRealm.java
Index: JDBCRealm.java
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/JDBCRealm.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JDBCRealm.java 23 Jun 2004 13:51:37 -0000 1.8
+++ JDBCRealm.java 22 Nov 2004 22:42:28 -0000 1.9
@@ -385,81 +385,44 @@
* @param username Username of the Principal to look up
* @param credentials Password or other credentials to use in
* authenticating this username
- *
- * @exception SQLException if a database error occurs
*/
public synchronized Principal authenticate(Connection dbConnection,
String username,
- String credentials)
- throws SQLException {
-
- // Look up the user's credentials
- String dbCredentials = null;
- PreparedStatement stmt = null;
- ResultSet rs = null;
-
- try {
- stmt = credentials(dbConnection, username);
- rs = stmt.executeQuery();
-
- if (rs.next()) {
- dbCredentials = rs.getString(1);
- }
- rs.close();
- rs = null;
- if (dbCredentials == null) {
- return (null);
- }
-
- dbCredentials = dbCredentials.trim();
+ String credentials) {
+ // No user - can't possibly authenticate
+ if (username == null) {
+ return (null);
+ }
- // Validate the user's credentials
- boolean validated = false;
- if (hasMessageDigest()) {
- // Hex hashes should be compared case-insensitive
- validated =
(digest(credentials).equalsIgnoreCase(dbCredentials));
- } else {
- validated = (digest(credentials).equals(dbCredentials));
- }
-
- if (validated) {
- if (container.getLogger().isTraceEnabled())
-
container.getLogger().trace(sm.getString("jdbcRealm.authenticateSuccess",
- username));
- } else {
- if (container.getLogger().isTraceEnabled())
-
container.getLogger().trace(sm.getString("jdbcRealm.authenticateFailure",
- username));
- return (null);
- }
+ // Look up the user's credentials
+ String dbCredentials = getPassword(username);
- // Accumulate the user's roles
- ArrayList roleList = new ArrayList();
- stmt = roles(dbConnection, username);
- rs = stmt.executeQuery();
- while (rs.next()) {
- String role = rs.getString(1);
- if (null!=role) {
- roleList.add(role.trim());
- }
- }
- rs.close();
- rs = null;
+ // Validate the user's credentials
+ boolean validated = false;
+ if (hasMessageDigest()) {
+ // Hex hashes should be compared case-insensitive
+ validated =
(digest(credentials).equalsIgnoreCase(dbCredentials));
+ } else {
+ validated = (digest(credentials).equals(dbCredentials));
+ }
- // Create and return a suitable Principal for this user
- return (new GenericPrincipal(this, username, credentials,
roleList));
- } finally {
- if (rs!=null) {
- try {
- rs.close();
- } catch(SQLException e) {
-
container.getLogger().warn(sm.getString("jdbcRealm.abnormalCloseResultSet"));
- }
- }
- dbConnection.commit();
+ if (validated) {
+ if (container.getLogger().isTraceEnabled())
+
container.getLogger().trace(sm.getString("jdbcRealm.authenticateSuccess",
+ username));
+ } else {
+ if (container.getLogger().isTraceEnabled())
+
container.getLogger().trace(sm.getString("jdbcRealm.authenticateFailure",
+ username));
+ return (null);
}
+ ArrayList roles = getRoles(username);
+
+ // Create and return a suitable Principal for this user
+ return (new GenericPrincipal(this, username, credentials, roles));
+
}
@@ -553,8 +516,49 @@
*/
protected String getPassword(String username) {
- return (null);
+ // Look up the user's credentials
+ String dbCredentials = null;
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+ try {
+ stmt = credentials(dbConnection, username);
+ rs = stmt.executeQuery();
+
+ if (rs.next()) {
+ dbCredentials = rs.getString(1);
+ }
+ rs.close();
+ rs = null;
+ if (dbCredentials == null) {
+ return (null);
+ }
+
+ dbCredentials = dbCredentials.trim();
+ return dbCredentials;
+
+ } catch(SQLException e){
+ container.getLogger().
+ error(sm.getString("jdbcRealm.getPassword.exception",
+ username));
+ } finally {
+ if (rs!=null) {
+ try {
+ rs.close();
+ } catch(SQLException e) {
+
container.getLogger().warn(sm.getString("jdbcRealm.abnormalCloseResultSet"));
+ }
+ }
+ try {
+ dbConnection.commit();
+ } catch (SQLException e) {
+ container.getLogger().
+ warn(sm.getString("jdbcRealm.getPassword.exception",
+ username));
+ }
+ }
+
+ return (null);
}
@@ -563,11 +567,64 @@
*/
protected Principal getPrincipal(String username) {
- return (null);
+ return (new GenericPrincipal(this,
+ username,
+ getPassword(username),
+ getRoles(username)));
}
+ /**
+ * Return the roles associated with the gven user name.
+ */
+ protected ArrayList getRoles(String username) {
+
+ PreparedStatement stmt = null;
+ ResultSet rs = null;
+
+ try {
+ // Accumulate the user's roles
+ ArrayList roleList = new ArrayList();
+ stmt = roles(dbConnection, username);
+ rs = stmt.executeQuery();
+ while (rs.next()) {
+ String role = rs.getString(1);
+ if (null!=role) {
+ roleList.add(role.trim());
+ }
+ }
+ rs.close();
+ rs = null;
+
+ return (roleList);
+
+ } catch(SQLException e){
+ container.getLogger().
+ error(sm.getString("jdbcRealm.getRoles.exception",
+ username));
+ } finally {
+ if (rs!=null) {
+ try {
+ rs.close();
+ } catch(SQLException e) {
+
container.getLogger().warn(sm.getString("jdbcRealm.abnormalCloseResultSet"));
+ }
+ }
+ try {
+ dbConnection.commit();
+ } catch (SQLException e) {
+ container.getLogger().
+ warn(sm.getString("jdbcRealm.getRoles.exception",
+ username));
+ }
+ }
+
+ return (null);
+
+ }
+
+
/**
* Open (if necessary) and return a database connection for use by
* this Realm.
1.8 +5 -1
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/LocalStrings.properties
Index: LocalStrings.properties
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/realm/LocalStrings.properties,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- LocalStrings.properties 21 Sep 2004 23:29:33 -0000 1.7
+++ LocalStrings.properties 22 Nov 2004 22:42:28 -0000 1.8
@@ -35,6 +35,8 @@
jdbcRealm.authenticateSuccess=Username {0} successfully authenticated
jdbcRealm.close=Exception closing database connection
jdbcRealm.exception=Exception performing authentication
+jdbcRealm.getPassword.exception=Exception retrieving password for "{0}"
+jdbcRealm.getRoles.exception=Exception retrieving roles for "{0}"
jdbcRealm.open=Exception opening database connection
jndiRealm.authenticateFailure=Username {0} NOT successfully authenticated
jndiRealm.authenticateSuccess=Username {0} successfully authenticated
@@ -65,4 +67,6 @@
dataSourceRealm.authenticateSuccess=Username {0} successfully authenticated
dataSourceRealm.close=Exception closing database connection
dataSourceRealm.exception=Exception performing authentication
+datasourceRealm.getPassword.exception=Exception retrieving password for "{0}"
+datasourceRealm.getRoles.exception=Exception retrieving roles for "{0}"
dataSourceRealm.open=Exception opening database connection
1.180 +3 -0 jakarta-tomcat-catalina/webapps/docs/changelog.xml
Index: changelog.xml
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/webapps/docs/changelog.xml,v
retrieving revision 1.179
retrieving revision 1.180
diff -u -r1.179 -r1.180
--- changelog.xml 22 Nov 2004 15:04:58 -0000 1.179
+++ changelog.xml 22 Nov 2004 22:42:29 -0000 1.180
@@ -47,6 +47,9 @@
<update>
<bug>32282</bug>: Modify Windows Uninstaller to only remove
webapps/ROOT and webapps if user asks to remove everything. (yoavs)
</update>
+ <update>
+ Add DIGEST authentication support to the JDBC realm. Supports both
digested and cleartext passwords. (markt)
+ </update>
</changelog>
</subsection>
1.22 +10 -4 jakarta-tomcat-catalina/webapps/docs/realm-howto.xml
Index: realm-howto.xml
===================================================================
RCS file: /home/cvs/jakarta-tomcat-catalina/webapps/docs/realm-howto.xml,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- realm-howto.xml 17 Nov 2004 16:50:31 -0000 1.21
+++ realm-howto.xml 22 Nov 2004 22:42:30 -0000 1.22
@@ -210,6 +210,13 @@
standard output.</li>
</ul>
+<p>If using digested passwords with DIGEST authentication, the cleartext used
+ to generate the digest is different. In the examples above
+ <code>{cleartext-password}</code> must be replaced with
+ <code>{username}:{realm}:{cleartext-password}</code>. For example, in a
+ development environment this might take the form
+ <code>testUser:localhost:8080:testPassword</code>.</p>
+
<p>To use either of the above techniques, the
<code>$CATALINA_HOME/server/lib/catalina.jar</code> file will need to be
on your class path to make the <code>RealmBase</code> class available.</p>
@@ -292,8 +299,6 @@
in the <em>users</em> table).</li>
<li>Role name of a valid role associated with this user.</li>
</ul></li>
-<li>Please note that the JDBCRealm currently does not support DIGEST
authentication
- (as opposed to BASIC authentication). It does support digested
passwords as explained here.</li>
</ul>
<h3>Quick Start</h3>
@@ -474,8 +479,9 @@
in the <em>users</em> table).</li>
<li>Role name of a valid role associated with this user.</li>
</ul></li>
-<li>Please note that the JDBCRealm currently does not support DIGEST
authentication
- (as opposed to BASIC authentication). It does support digested
passwords as explained here.</li>
+<li>Please note that the DataSourceRealm currently does not support DIGEST
+ authentication (as opposed to BASIC authentication). It does support
+ digested passwords as explained here.</li>
</ul>
<h3>Quick Start</h3>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]