jaas之登入執行個體

來源:互聯網
上載者:User

JAAS:Java Authentication and Authorization Service,提供了認證和授權架構。

本例是認證的實現,JAAS定義了可插拔的認證機制,使認證邏輯獨立開來,可通過修改設定檔切換認證模組。



一、設定檔及設定

1. 設定檔(假設為D:/jaas.conf): Sample{
  com.fastunit.samples.jaas.SampleLoginModule required debug=false;
};

此檔案定義了一個“Sample”驗證模組,使用SampleLoginModule來進行驗證。

2. 啟用設定檔:
-Djava.security.auth.login.config=D:/jaas.conf

二、用戶端調用 import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import javax.servlet.http.HttpServletRequest;

public class LoginManager {

  public static boolean login(HttpServletRequest request) {
    try {
      String username = request.getParameter("username");
      String password = request.getParameter("password");
      //此處指定了使用設定檔的“Sample”驗證模組,對應的實作類別為SampleLoginModule
      LoginContext lc = new LoginContext("Sample", new SampleCallbackHandler(
          username, password));
      lc.login();// 如果驗證失敗會拋出異常
      return true;
    } catch (LoginException e) {
      e.printStackTrace();
      return false;
    } catch (SecurityException e) {
      e.printStackTrace();
      return false;
    }
  }

}

  import java.io.IOException;

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;

public class SampleCallbackHandler implements CallbackHandler {
  private String username;
  private String password;

  public SampleCallbackHandler(final String username, final String password) {
    this.username = username;
    this.password = password;
  }

  public void handle(Callback[] callbacks) throws IOException,
      UnsupportedCallbackException {
    for (int index = 0; index < callbacks.length; index++) {
      if (callbacks[index] instanceof NameCallback) {
        NameCallback ncb = (NameCallback) callbacks[index];
        ncb.setName(username);
      }
      if (callbacks[index] instanceof PasswordCallback) {
        PasswordCallback pcb = (PasswordCallback) callbacks[index];
        pcb.setPassword(password.toCharArray());
      }
    }
  }
}

三、驗證實現 import java.io.IOException;
import java.util.Map;

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.spi.LoginModule;

public class SampleLoginModule implements LoginModule {
  private boolean isAuthenticated = false;
  private CallbackHandler callbackHandler;
  private Subject subject;
  private SamplePrincipal principal;

  public void initialize(Subject subject, CallbackHandler callbackHandler,
      Map sharedState, Map options) {
    this.subject = subject;
    this.callbackHandler = callbackHandler;
  }

  public boolean login() throws LoginException {
    try {
      NameCallback nameCallback = new NameCallback("username");
      PasswordCallback passwordCallback = new PasswordCallback("password",
          false);
      final Callback[] calls = new Callback[] { nameCallback, passwordCallback };

      // 擷取使用者資料
      callbackHandler.handle(calls);
      String username = nameCallback.getName();
      String password = String.valueOf(passwordCallback.getPassword());

      // TODO 驗證,如:查詢資料庫、LDAP。。。

      if (true) {// 驗證通過
        principal = new SamplePrincipal(username);
        isAuthenticated = true;
      } else {
        throw new LoginException("user or password is wrong");
      }

    } catch (IOException e) {
      throw new LoginException("no such user");
    } catch (UnsupportedCallbackException e) {
      throw new LoginException("login failure");
    }
    return isAuthenticated;
  }

  /**
   * 驗證後的處理,在Subject中加入使用者物件
   */
  public boolean commit() throws LoginException {
    if (isAuthenticated) {
      subject.getPrincipals().add(principal);
    } else {
      throw new LoginException("Authentication failure");
    }
    return isAuthenticated;
  }

  public boolean abort() throws LoginException {
    return false;
  }

  public boolean logout() throws LoginException {
    subject.getPrincipals().remove(principal);
    principal = null;
    return true;
  }
}

 
import java.security.Principal;

public final class SamplePrincipal implements Principal {

  private String name;

  public SamplePrincipal(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public boolean equals(Object o) {
    return (o instanceof SamplePrincipal)
        && this.name.equalsIgnoreCase(((SamplePrincipal) o).name);
  }

  public int hashCode() {
    return name.toUpperCase().hashCode();
  }

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.