Java ile yazdýðýnýz uygulamanýn kaynak kodlarýnda bir satýr bile deðiþtirmeden kullanýcý adý ve þifre kontrolünü, akýllý kart kullanýmýný ya da parmak izi kullanýmýný nasýl eklersiniz?
JAAS (Java Authentication and Authorization Service) paketleri Java’nýn içindeki güvenlik sistemini biraz daha geliþtiriyor ve farklý kaynaklar kullanýlarak güvenlik sistemleri oluþturmayý mümkün hale getiriyor.
Java SDK içindeki java.security.* paketleri bir uygulamanýn güvenliðinin saðlanmasý için temel metotlarý içeriyor. Bunlar arasýnda byte-code doðrulayýcýsý (byte-code verifier), sýnýf yükleyicisi (class loader), güvenlik yöneticisi (security manager), eriþim denetleyicisi (access controller), politikalar (policy) ve koruyucu alanlar (protecting domain) sayýlabilir.
Bunlara ek olarak geniþletme kütüphaneleri (extension API) sayesinde uygulamalarýn güvenliði istenilen seviyelerde arttýrýlabiliyor. JAAS bunlardan birisi…
JAAS temel olarak uygulamaya kimlik bilgisi döndürecek bir LoginContext ve bu kimlik bilgisinin çeþitli yollarla elde edilmesini saðlayan bir LoginModule‘den oluþuyor.
LoginModule sýnýfýndan geniþletilerek oluþturulan modüller kimlik bilgisi için bir veritabanýna baðlanan, Kerberos ya da LDAP dizininden kullanýcý bilgisi alan, akýllý kart okuyucudan veya parmak izi okuyucudan bilgi aktaran bir yapýda tasarlanabilir. Uygulamadan baðýmsýz olarak modüller tasarlamak bize eklenip çýkarýlabilir bir kimlik denetimi yapýsý saðlar.

Uygulamamýzda JAAS kullanmak için þöyle bir yol izliyoruz:
Öncelikle bir konfigürasyon dosyasý oluþturuyoruz. Daha sonra uygulamayý çalýþtýrýrken parametre olarak bu dosyayý vereceðiz.
jaas.config
Ornek
{
DBLoginModule required
debug="true"
url="jdbc:mysql://localhost/jaasdb?user=root&password=pass"
driver="org.gjt.mm.mysql.Driver";
};
Uygulamayý çalýþtýrýrken kullanýmý:
java -Djava.security.auth.login.config=jaas.config JaasTest
Burada kullanacaðýmýz modül, bir MySql veritabanýna baðlanarak kullanýcý adý kontrolü yapýyor.
JaasTest uygulamamýza bu modüllere eriþip kullanacak LoginContext’i tanýmlýyoruz.
JaasTest.java
...
/* JAAS sýnýflarý */
import java.security.*;
import javax.security.auth.*;
import javax.security.auth.login.*;
...
try {
// LoginModule ile haberleþecek olan sýnýf
ConsoleCallbackHandler cbh = new ConsoleCallbackHandler();
LoginContext lc = new LoginContext("Ornek", cbh);
try {
// LoginModule içinde login metodunu kendimize uygun þekilde
// tanýmlayacaðýz.
lc.login();
// Subject : kimlik denetimi bilgilerini içeren nese
subject = lc.getSubject();
// Principal : Yetkili olan kiþiler vb.
Iterator it = subject.getPrincipals().iterator();
// Credential : Yetkiler, haklar vb.
it = subject.getPublicCredentials(Properties.class).iterator();
...
// Programýn çalýþma rutinleri
// Program çýkýþýnda
lc.logout();
} catch (LoginException lex)
{
....
}
} catch (Exception ex)
{
...
}
System.exit(0);
}
Temel anlamda kullanýlan sýnýf ve metotlar böyle…
Þimdi MySQL veritabanýna baðlanýp kontrol yapan login modülümüze bakalým.
DBLoginModule.java
...
import java.security.*;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.login.LoginException;
import javax.security.auth.Subject;
import javax.security.auth.callback.*;
...
public class DBLoginModule implements LoginModule
{
// initial state
CallbackHandler callbackHandler;
Subject subject;
...
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
// ön iþlemler
}
public boolean login() throws LoginException
{
// veritabanýna baðlanýp yapýlacak kontroller
// Buraya akýllý kart, parmak izi okuyucu vb.
// kontrolleri eklenebilir
}
public boolean commit() throws LoginException
{
// Otomatikmen çalýþýr
// login iþlemi doðru yapýldý ise true, deðilse false döndürür
}
public boolean abort() throws javax.security.auth.login.LoginException
{
// iþlem baþarýsýz olduðunda burasý çalýþýr
}
public boolean logout() throws javax.security.auth.login.LoginException
{
// uygulamadan çýkýþta yetkileri temizler
}
}
Bu örnekte veritabanýna baðlandýk. Sadece LoginModule ve jaas.config dosyalarýnda deðiþiklik yapýlarak istenen kontrol yöntemi uygulanabilir. Böylelikle uygulamamýzýn kaynak koduna müdahale etmeden güvenlik kontrolü ekleyebiliriz.
JAAS konusunda bilgilenmek isteyenler için maalesef Türkçe doküman yok. Ancak Ýngilizce olarak þu bilgilendirici sunum, þu yazý, Sun sitesindeki orijinal kýlavuz faydalý olabilir. Ayrýca veritabanýna baðlanan, akýllý kart okuyucudan bilgi alan, parmak izi okuyucuya baðlanan örnekler incelenebilir.