⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 databaseloginmodule.java

📁 如题ServletJSP.rar 为网络收集的JSP网站源文件
💻 JAVA
字号:
package org.redsoft.forum.security;

import org.redsoft.forum.dao.AccountDAO;
import org.redsoft.forum.dao.DAOFactory;
import org.redsoft.forum.web.Account;
import org.redsoft.forum.exception.AccountNotFoundException;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginException;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.util.Map;
import java.util.Properties;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.io.IOException;

/*
 * A dependent Database login module for JAAS
 * To build a generic one,just replace the db operation with a generic way like use class loader to load the driver
 * and create the connection
 *
 * @author Charles Huang
 * @since JDK1.4
 * @version $Id: DataBaseLoginModule.java,v 1.1.1.1 2003/07/08 08:25:16 cinc Exp $
 */
public class DataBaseLoginModule implements LoginModule{


    // All the properties used to connec to DB
    private Properties options;

    //obtained from LoginContext
	private Subject subject;

    private CallbackHandler callbackHandler;

    private boolean isAuthenticated = false;

    private String username;

    /**
     * Initialize this LoginModule.
     *
     * <p> This method is called by the <code>LoginContext</code>
     * after this <code>LoginModule</code> has been instantiated.
     * The purpose of this method is to initialize this
     * <code>LoginModule</code> with the relevant information.
     * If this <code>LoginModule</code> does not understand
     * any of the data stored in <code>sharedState</code> or
     * <code>options</code> parameters, they can be ignored.
     *
     * <p>
     *
     * @param subject the <code>Subject</code> to be authenticated. <p>
     *
     * @param callbackHandler a <code>CallbackHandler</code> for communicating
     *			with the end user (prompting for usernames and
     *			passwords, for example). <p>
     *
     * @param sharedState state shared with other configured LoginModules. <p>
     *
     * @param options options specified in the login
     *			<code>Configuration</code> for this particular
     *			<code>LoginModule</code>.
     */
    public void initialize(Subject subject, CallbackHandler callbackHandler,
                           Map sharedState, Map options) {
        this.subject = subject;
        this.callbackHandler = callbackHandler;
    }

    /**
     * Method to authenticate a <code>Subject</code> (phase 1).
     *
     * <p> The implementation of this method authenticates
     * a <code>Subject</code>.  For example, it may prompt for
     * <code>Subject</code> information such
     * as a username and password and then attempt to verify the password.
     * This method saves the result of the authentication attempt
     * as private state within the LoginModule.
     *
     * <p>
     *
     * @exception LoginException if the authentication fails
     *
     * @return true if the authentication succeeded, or false if this
     *			<code>LoginModule</code> should be ignored.
     */
    public boolean login() throws LoginException {

        try{
            // Retrieve the user name and password from the screen through the callback handler
            final Callback[] calls= new Callback[2];
            calls[0]=new NameCallback("name");
            calls[1]=new PasswordCallback("Password",false);
            if(callbackHandler == null){
                throw new LoginException("callback is null");
            }
            callbackHandler.handle(calls);
            username =((NameCallback) calls[0]).getName();
            if( username.equals( null ))
                throw new LoginException("name must not be null");
            final String password = String.valueOf(((PasswordCallback)(calls[1])).getPassword());
            if( password.equals( null ) )
                throw new LoginException("password must not be null");

            // Find the user and match the password
            final AccountDAO dao = DAOFactory.getInstance().getAccountDAO();
            final Account account = dao.findByUserName( username );
            if( !password.equals( account.getPassword() ) ){
                throw new LoginException("Invalid password");
            }
        }catch ( final AccountNotFoundException ex) {
            throw new LoginException( ex.toString() + ":" + username );
        }catch ( final SQLException sqlExeption ){
            throw new LoginException( sqlExeption.getMessage() );
        }catch ( final IOException ioException ){
            throw new LoginException( ioException.getMessage() );
        }catch ( final UnsupportedCallbackException unsupported ){
            throw new LoginException( unsupported.getMessage() );
        }
        isAuthenticated = true;
        // Nothnig went wrong,authenctication succeed
        return isAuthenticated;
    }

    /**
     * Method to commit the authentication process (phase 2).
     *
     * <p> This method is called if the LoginContext's
     * overall authentication succeeded
     * (the relevant REQUIRED, REQUISITE, SUFFICIENT and OPTIONAL LoginModules
     * succeeded).
     *
     * <p> If this LoginModule's own authentication attempt
     * succeeded (checked by retrieving the private state saved by the
     * <code>login</code> method), then this method associates relevant
     * Principals and Credentials with the <code>Subject</code> located in the
     * <code>LoginModule</code>.  If this LoginModule's own
     * authentication attempted failed, then this method removes/destroys
     * any state that was originally saved.
     *
     * <p>
     *
     * @exception LoginException if the commit fails
     *
     * @return true if this method succeeded, or false if this
     *			<code>LoginModule</code> should be ignored.
     */
    public boolean commit() throws LoginException {
        if ( isAuthenticated ){
            subject.getPrincipals().add( new User( username ) );
            //TODO: Put in role information later
        }else{
            throw new LoginException("Authentication fails");
        }
        return isAuthenticated;
    }

    /**
     * Method to abort the authentication process (phase 2).
     *
     * <p> This method is called if the LoginContext's
     * overall authentication failed.
     * (the relevant REQUIRED, REQUISITE, SUFFICIENT and OPTIONAL LoginModules
     * did not succeed).
     *
     * <p> If this LoginModule's own authentication attempt
     * succeeded (checked by retrieving the private state saved by the
     * <code>login</code> method), then this method cleans up any state
     * that was originally saved.
     *
     * <p>
     *
     * @exception LoginException if the abort fails
     *
     * @return true if this method succeeded, or false if this
     *			<code>LoginModule</code> should be ignored.
     */
    public boolean abort() throws LoginException {
        return false;
    }

    /**
     * Method which logs out a <code>Subject</code>.
     *
     * <p>An implementation of this method might remove/destroy a Subject's
     * Principals and Credentials.
     *
     * <p>
     *
     * @exception LoginException if the logout fails
     *
     * @return true if this method succeeded, or false if this
     *			<code>LoginModule</code> should be ignored.
     */
    public boolean logout() throws LoginException {
        return false;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -