|
What this is
Other links
The source code
/*
* $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/aaa/JDBCRealm.java,v 1.11 2004/02/25 06:52:40 billbarker Exp $
* $Revision: 1.11 $
* $Date: 2004/02/25 06:52:40 $
*
*
* Copyright 1999-2004 The Apache Sofware Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tomcat.modules.aaa;
import java.security.Principal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import org.apache.tomcat.core.Context;
import org.apache.tomcat.core.TomcatException;
import org.apache.tomcat.util.aaa.SimplePrincipal;
/**
* Implmentation of Realm that works with any JDBC supported database.
* See the JDBCRealm.howto for more details on how to set up the database and
* for configuration options.
*
* @author Craig R. McClanahan
* @author Carson McDonald
* @author Ignacio J. Ortega
* @author Bip Thelin
*/
public class JDBCRealm extends RealmBase {
// ----------------------------------------------------- Instance Variables
private boolean started=false;
/** The connection to the database. */
private Connection dbConnection = null;
/** The PreparedStatement to use for authenticating users. */
private PreparedStatement preparedAuthenticate = null;
/** The PreparedStatement to use for identifying the roles for a specified user. */
private PreparedStatement preparedRoles = null;
/** The connection URL to use when trying to connect to the databse */
protected String connectionURL = null;
/** The connection URL to use when trying to connect to the databse */
protected String connectionName = null;
/** The connection URL to use when trying to connect to the databse */
protected String connectionPassword = null;
/** The table that holds user data. */
protected String userTable = null;
/** The column in the user table that holds the user's name */
protected String userNameCol = null;
/** The column in the user table that holds the user's credintials */
protected String userCredCol = null;
/** The table that holds the relation between user's and roles */
protected String userRoleTable = null;
/** The column in the user role table that names a role */
protected String roleNameCol = null;
/** The JDBC driver to use. */
protected String driverName = null;
/** Has the JDBC connection been started? */
protected boolean JDBCStarted = false;
boolean connectOnInit = false;
// ------------------------------------------------------------- Properties
/**
* Set the JDBC driver that will be used.
* @param driverName The driver name
*/
public void setDriverName(String driverName) {
this.driverName = driverName;
}
/**
* Set the URL to use to connect to the database.
* @param connectionURL The new connection URL
*/
public void setConnectionURL(String connectionURL) {
this.connectionURL = connectionURL;
}
/**
* Set the name to use to connect to the database.
* @param connectionName User name
*/
public void setConnectionName(String connectionName) {
this.connectionName = connectionName;
}
/**
* Return status of connectionName
*/
public boolean isConnectionNameSet() {
return (connectionName != null);
}
/**
* Set the password to use to connect to the database.
* @param connectionPassword User password
*/
public void setConnectionPassword(String connectionPassword) {
this.connectionPassword = connectionPassword;
}
/**
* Return status of connectionPassword
*/
public boolean isConnectionPasswordSet() {
return (connectionPassword != null);
}
/**
* Set the table that holds user data.
* @param userTable The table name
*/
public void setUserTable(String userTable) {
this.userTable = userTable;
}
/**
* Set the column in the user table that holds the user's name
* @param userNameCol The column name
*/
public void setUserNameCol(String userNameCol) {
this.userNameCol = userNameCol;
}
/**
* Set the column in the user table that holds the user's credintials
* @param userCredCol The column name
*/
public void setUserCredCol(String userCredCol) {
this.userCredCol = userCredCol;
}
/**
* Set the table that holds the relation between user's and roles
* @param userRoleTable The table name
*/
public void setUserRoleTable(String userRoleTable) {
this.userRoleTable = userRoleTable;
}
/**
* Set the column in the user role table that names a role
* @param roleNameCol The column name
*/
public void setRoleNameCol(String roleNameCol) {
this.roleNameCol = roleNameCol;
}
/**
* When connectOnInit is true the JDBC connection is started at tomcat init
* if false the connection is started the first times it is needed.
* @param b
*/
public void setConnectOnInit(boolean b) {
connectOnInit = b;
}
/**
* If there are any errors with the JDBC connection, executing
* the query or anything we return false (don't authenticate). This event
* is also logged.
* If there is some SQL exception the connection is set to null.
* This will allow a retry on the next auth attempt. This might not
* be the best thing to do but it will keep tomcat from needing a restart
* if the database goes down.
*
* @param username Username of the Principal to look up
* @param credentials Password or other credentials to use in authenticating this username
*/
public synchronized String getCredentials(String username){
try {
if (!checkConnection())
return null;
// Create the authentication search prepared statement if necessary
if (preparedAuthenticate == null) {
preparedAuthenticate=getPreparedAuthenticate(dbConnection);
}
// Perform the authentication search
preparedAuthenticate.setString(1, username);
ResultSet rs1 = preparedAuthenticate.executeQuery();
if (rs1.next()) {
return rs1.getString(1).trim();
}
rs1.close();
return null;
} catch (SQLException ex) {
// Log the problem for posterity
log(sm.getString("jdbcRealm.getCredentialsSQLException", username), ex);
// Clean up the JDBC objects so that they get recreated next time
// Return "not authenticated" for this request
close();
return null;
}
}
protected PreparedStatement getPreparedAuthenticate(Connection conn) throws SQLException {
String sql = "SELECT " + userCredCol
+ " FROM " + userTable
+ " WHERE " + userNameCol + " = ?";
if (debug >= 1)
log("JDBCRealm.authenticate: " + sql);
return conn.prepareStatement(sql);
}
protected PreparedStatement getPreparedRoles(Connection conn) throws SQLException {
String sql = "SELECT " + roleNameCol + " FROM " + userRoleTable
+ " WHERE " + userNameCol + " = ?";
if (debug >= 1)
log("JDBCRealm.roles: " + sql);
return conn.prepareStatement(sql);
}
private boolean checkConnection() {
try {
if ((dbConnection == null) || dbConnection.isClosed()) {
Class.forName(driverName);
if( JDBCStarted )
log(sm.getString("jdbcRealm.checkConnectionDBClosed"));
if ((connectionName == null || connectionName.equals("")) ||
(connectionPassword == null || connectionPassword.equals(""))) {
dbConnection = DriverManager.getConnection(connectionURL);
} else {
dbConnection = DriverManager.getConnection(connectionURL,
connectionName, connectionPassword);
}
JDBCStarted=true;
if (dbConnection == null || dbConnection.isClosed()) {
log(sm.getString("jdbcRealm.checkConnectionDBReOpenFail"));
return false;
}
}
return true;
} catch (SQLException ex) {
log(sm.getString("jdbcRealm.checkConnectionSQLException"), ex);
close();
return false;
}
catch (ClassNotFoundException ex) {
throw new RuntimeException("JDBCRealm.checkConnection: " + ex);
}
}
/**
* returns all the roles for a given user.
*
* @param username the user name
* @return the roles array
*/
public synchronized String[] getUserRoles(String username) {
try {
if (!checkConnection())
return null;
if (preparedRoles == null) {
preparedRoles=getPreparedRoles(dbConnection);
}
preparedRoles.clearParameters();
preparedRoles.setString(1, username);
ResultSet rs = preparedRoles.executeQuery();
// Next we convert the resultset into a String[]
Vector vrol = new Vector();
while (rs.next()) {
vrol.addElement(rs.getString(1).trim());
}
String[] res = new String[vrol.size() > 0 ? vrol.size() : 1];
// no roles case
if (vrol.size() == 0) {
res[0] = "";
return res;
}
for (int i = 0; i < vrol.size(); i++)
res[i] = (String)vrol.elementAt(i);
return res;
}
catch (SQLException ex) {
// Set the connection to null.
// Next time we will try to get a new connection.
log(sm.getString("jdbcRealm.getUserRolesSQLException", username));
close();
}
return null;
}
// Nothing - except carry on the class name information
public static class JdbcPrincipal extends SimplePrincipal {
private String name;
JdbcPrincipal(String name) {
super(name);
}
}
private void close() {
if (preparedRoles != null) {
try {
preparedRoles.close();
} catch (Throwable t) {
;
}
preparedRoles = null;
}
if (preparedAuthenticate != null) {
try {
preparedAuthenticate.close();
} catch (Throwable t) {
;
}
preparedAuthenticate = null;
}
if (dbConnection != null) {
try {
dbConnection.close();
} catch (Throwable t) {
;
}
dbConnection = null;
}
}
public void contextShutdown(Context ctx) throws TomcatException {
if (started && JDBCStarted) close();
}
public void contextInit(Context ctx) throws TomcatException {
if (!started) {
if (connectOnInit && !checkConnection()) {
throw new RuntimeException("JDBCRealm cannot be started");
}
started=true;
}
}
/**
* getPrincipal
* @param username
* @return java.security.Principal
*/
protected Principal getPrincipal(String username) {
return new JdbcPrincipal( username );
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.