13 Şubat 2020 Perşembe

JAAS LoginModule Arayüzü - Bu Sınıfı Kendimiz Yazarız

Giriş
Şu satırı dahil ederiz.
import javax.security.login.LoginModule;
Açıklaması şöyle. JVM ile bazı hazır LoginModule sınıfları geliyor.
JAAS provides some reference LoginModule implementations, such as the JndiLoginModule; you can also develop your own,...
Açıklaması şöyle. İstersek kendi LoginModule sınıfımızı yazarız.
This interface is primarily meant for JAAS providers. It allows JAAS providers to implement and plug in authentication mechanisms as login modules. LoginModules are plugged into an application environment to provide a particular type of authentication. In an authentication process, each LoginModule is initialized with a Subject, a CallbackHandler, shared LoginModule state, and LoginModule-specific options. The LoginModule uses the CallbackHandler to communicate with the user. J2SE 1.4 provides a number of LoginModules bundled under the com.sun.security.auth.module package.
Önce her modülün initialize() + login() metodları çağrılır. Login başarılı ise true döner. Daha sonra her modülün commit() metodu çağrılır.

Dosya
Şöyle yaparız. Dosyanın ismi MyLoginJAAS.conf olsun
MyLogin { 
  com.foo.bar.MyLoginModule1 required doNotCheck=true;
  com.foo.bar.MyLoginModule2 optional;
};
abort metodu
İmzası şöyle.
public boolean abort() throws LoginException;
initialize metodu
İmzası şöyle.
public void initialize(Subject subject, CallbackHandler callbackHandler, 
  Map<String, ?> sharedState, Map<String, ?> options);
- Parametre olarak geçilen subject nesnesini sınıf içindeki bir değişkende saklamak gerekir.
- Parametre olarak geçilen callbackHandler nesnesini sınıf içindeki bir değişkende saklamak gerekir.
- options nesnesi -Djava.security.auth.login.config=/conf/MyJaas.config seçeneği ile verilen ayarları içerir.

login metodu
İmzası şöyle.
public boolean login() throws LoginException;
init() metodu ile bize verilen ve sakladığımız callbackHandler nesnesinin handle() metodunu kendi javax.security.auth.callback.Callback nesnelerimiz ile çağırırız. Her callback bize bir sonuç döner. Örneğin ilk callback kullanıcı adını döndürür. İkinci callback ise şifreyi döndürür.
Bu bilgileri kullanarak kullanıcıyı doğrularız.

Eğer kullanıcıyı doğrulayabilirsek bunu bir değişken içinde ismi loginVerification olan bir değişken içinde saklarız. Bu değişkenin amacı commit() metodu çağrılınca login() metodunun sonucunu hatırlamaktır.

Eğer kullanıcıyı doğrulayamazsak RuntimeLoginException() fırlatırız.

Eğer LoginModule sınıfımızın dikkate alınmasını istemiyorsak bu metoddan false döneriz.
Örnek
Şöyle yaparız.
public boolean login() throws LoginException {

  try {
    // Setup the callbacks to obtain user authentication information
    Callback myCallback[] = new Callback[2];         
    myCallback[0] = new NameCallback(" Enter Username:");
    myCallback[1] = new PasswordCallback("Enter Password:", false);

    // Invoke the handle() method in the Callbackhandler
    CallbackHandler.handle(myCallback);

    // Get the username and password from the callback
    myName = ((NameCallback) myCallback[0]).getName();
    myPassword = new String ((PasswordCallback)myCallback[1]).getPassword());

    // Perform a simple verification
    if (( myName.equals("ramesh"))&& (myPassword.equals("javaguy"))) {             
      loginVerification = true;
    }
    else {
      loginVerification = false;
    }
  } catch (Exception e) {
    throw new LoginException("Login failed")
  }
  return true;
}
logout metodu
İmzası şöyle.
public boolean logout() throws LoginException;
initialize metodunda sakladığımız subject nesnesine ait java.security.Principal nesnelerini sileriz. Şöyle yaparız.
public boolean logout() throws LoginException
{
  subject.getPrincipals().removeAll(principals);
  principals.clear();
  return true;
}

Hiç yorum yok:

Yorum Gönder