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

📄 sampleloginmodule.java

📁 weblogic应用全实例
💻 JAVA
字号:
/**
 * SampleLoginModule.java
 *
 * 这个LoginModule使用用户名/密码认证用户
 * 
 */

package examples.security.jaas;

import java.util.Map;
import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.login.FailedLoginException;
import javax.security.auth.spi.LoginModule;
import weblogic.security.auth.Authenticate;
import weblogic.jndi.Environment;

/**
 * 执行密码认证的注册模型示例。
 */


public class SampleLoginModule implements LoginModule 
{
  private Subject subject = null;
  private CallbackHandler callbackHandler = null;
  private Map sharedState = null;
  private Map options = null;
  private String url = null;

  // 认证状态
  private boolean succeeded = false;
  private boolean commitSucceeded = false;

  // 用户名和密码
  private String username = null;
  private String password = null;

  /**
   * 初始化
   */
  public void initialize(Subject subject,
                         CallbackHandler callbackHandler,
                         Map sharedState,
                         Map options) 
  {
    this.subject = subject;
    this.callbackHandler = callbackHandler;
    this.sharedState = sharedState;
    this.options = options;
    try
    {
      // 获取服务器 URL 
      url = System.getProperty("weblogic.security.jaas.ServerURL");
    }
    catch(NullPointerException npe)
    {
      System.err.println("Error: ServerURL Not Specified");
    }
    catch(IllegalArgumentException iae)
    {
      System.err.println("Error: ServerURL Not Specified");
    }
    catch(SecurityException se)
    {
      System.err.println("Error: Security Exception on accessing ServerURL Specification");
    }
  }

  /**
   * 使用用户名和密码进行用户认证
   * @返回true,在任何情况下
   *
   * @异常 FailedLoginException 如果认证失败
   *
   * @异常 LoginException 如果这个LoginModule不能执行认证
   */
  public boolean login() throws LoginException 
  {
    // 确认客户端提供了一个回调句柄
    if(callbackHandler == null)
      throw new LoginException("没有指定 CallbackHandler ");

    // 设置callback列表
    Callback[] callbacks = new Callback[2];
    callbacks[0] = new NameCallback("username: ");
    callbacks[1] = new PasswordCallback("password: ", false);
    try
    {
      // 弹出窗口,获取用户名和密码
      callbackHandler.handle(callbacks);

      // 获取用户名
      username = ((NameCallback) callbacks[0]).getName();

      // 获取密码,并从char[] 转化到String
      char[] charPassword = ((PasswordCallback) callbacks[1]).getPassword();
      if(charPassword == null)
      {
        // 把 NULL 密码当作空字符处理,
        charPassword = new char[0];
      }
      password = new String(charPassword);
    }
    catch(IOException ioe)
    {
      throw new LoginException(ioe.toString());
    }
    catch(UnsupportedCallbackException uce)
    {
      throw new LoginException("Error: Callback " + uce.getCallback().toString() + " Not Available");
    }

    // 设置 weblogic 环境变量,并认证
    Environment env = new Environment();
    env.setProviderUrl(url);
    env.setSecurityPrincipal(username);
    env.setSecurityCredentials(password);
    try
    {
      // 认证用户的身份
      Authenticate.authenticate(env, subject);
    }
    catch(RemoteException re)
    {
      System.err.println("Error: Remote Exception on authenticate, " + re.getMessage());
      throw new LoginException(re.toString());
    }
    catch(IOException ioe)
    {
      System.err.println("Error: IO Exception on authenticate, " + ioe.getMessage());
      throw new LoginException(ioe.toString());
    }
    catch(LoginException le)
    {
      System.err.println("Error: Login Exception on authenticate, " + le.getMessage());
      throw new LoginException(le.toString());
    }

    // 成功认证
    succeeded = true;
    return succeeded;
  }

  /**
   * 如果LoginContext的所有认证成功(相关必须、足够、可选的LoginModules成功),则调用这个方法。
   *
   * 如果这个LoginModule自己的认证失败,则这个方法清除所有当初保存的状态。
   *
   * @异常 LoginException 如果commit错误
   *
   * @返回true如果这个LoginModule自己的login和commit成功,否则返回false。
   */
  public boolean commit() throws LoginException
  {
    if(succeeded)
    {
      commitSucceeded = true;
      return true;
    }
    else
    {
      username = null;
      password = null;
      return false;
    }
  }

  /**
   * 如果LoginContext的所有认证失败,则调用这个方法。
   * 如果这个LoginModule自己的认证成功(通过检查重新获取login方法和commit方法保存的私有状态),
   * 那么,这个方法清除所有当初保存的状态。
   *
   * @异常 LoginException 如果 abort 失败
   *
   * @返回 false 如果这个LoginModule自己的login 和/或commit 失败,否则返回true。
   */
  public boolean abort() throws LoginException
  {
    if(succeeded == false)
    {
      return false;
    }
    else if((succeeded == true) && (commitSucceeded == false))
    {
      // Login 成功,但所有的认证失败
      succeeded = false;
      username = null;
      password = null;
    }
    else
    {
      // 所有的认证成功并且commit成功,
      // 但是认证链下一个commit失败。
      logout();
    }
    return true;
  }

  /**
   * 注销用户
   *
   * @异常 LoginException 如果注销失败
   *
   * @所有情况下返回true,因为这个this LoginModule不该被忽略
   */
  public boolean logout() throws LoginException
  {
    succeeded = false;
    commitSucceeded = false;
    username = null;
    password = null;
    return true;
  }
}

⌨️ 快捷键说明

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