Monday, April 13, 2009

Autentifikasi Menggunakan JAAS Configuration Class

Menggunakan file teks untuk melakukan konfigurasi pada proses autentifikasi dengan JAAS seperti pada contoh berikut

SimpleLoginContext
{
edu.mat.jaas.SimpleLoginModule REQUIRED;
};


membutuhkan argumen -Djava.security.auth.login.config=nama_file.config saat runtime. Untuk menghindarinya, kita bisa memanfaatkan database untuk menggantikan fungsi file teks tersebut. Berikut adalah contoh tabel app_configuration untuk menggantikan isi file tersebut

CREATE TABLE app_configuration (
login_module_class text NOT NULL,
control_flag text,
app_name text NOT NULL
);
ALTER TABLE ONLY app_configuration
ADD CONSTRAINT "APP_CONFIGURATION_PK" PRIMARY KEY (app_name, login_module_class);

Selanjutnya yang perlu dibuat adalah tabel principal yang digunakan untuk menyimpan principal-principal yang aplikasi kita miliki, serta tabel db_user untuk meyimpan user yang menggunakan aplikasi dan yang akan kita autentifikasi tentunya

CREATE TABLE principal (
principal_name text NOT NULL,
principal_class text
);
ALTER TABLE ONLY principal
ADD CONSTRAINT "PRINCIPAL_PK" PRIMARY KEY (principal_name);

CREATE TABLE db_user (
username text NOT NULL,
phone text,
address text,
passwd text
);
ALTER TABLE ONLY db_user
ADD CONSTRAINT "DB_USER_PK" PRIMARY KEY (username);

Seperti telah dijelaskan sebelumnya bahwa satu user/subject bisa memiliki lebih dari satu role/principal, dan sebuah principal/role bisa berasosiasi dengan lebih dari satu user/subject, maka relasi db_user dengan principal adalah many to many. Dengan demikian, data model akan memunculkan sebuah tabel baru principal_db_user dengan struktur seperti berikut

CREATE TABLE principal_db_user (
principal_name text NOT NULL,
username text NOT NULL
);
ALTER TABLE ONLY principal_db_user
ADD CONSTRAINT "PK" PRIMARY KEY (principal_name, username);
ALTER TABLE ONLY principal_db_user
ADD CONSTRAINT "FK1" FOREIGN KEY (principal_name) REFERENCES principal(principal_name);
ALTER TABLE ONLY principal_db_user
ADD CONSTRAINT "FK2" FOREIGN KEY (username) REFERENCES db_user(username);

Setelah data model selesai dibuat, bagaimana menghubungkannya dengan JAAS? Jawabannya ada pada class abstract Configuration. Kita bisa membuat sebuah class yang extends Configuration dan implements method getAppConfigurationEntry() untuk mendapatkan LoginModule dari tabel app_configuration. Berikut adalah contoh class yang dimaksud

public class DbConfiguration extends Configuration {
static private DbConfiguration dbConfig;

static public void init() {
dbConfig = new DbConfiguration();
Configuration.setConfiguration(dbConfig);
}

static public DbConfiguration getDbConfiguration() {
return dbConfig;
}

public AppConfigurationEntry[] getAppConfigurationEntry(String applicationName) {
...
String sql = "SELECT login_module_class, control_flag FROM app_configuration WHERE app_name=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, applicationName);
ResultSet rs = pstmt.executeQuery();
List entries = new ArrayList();
while (rs.next()) {
String loginModuleClass = rs.getString("login_module_class");
String controlFlagValue = rs.getString("control_flag");
AppConfigurationEntry.LoginModuleControlFlag controlFlag = resolveControlFlag(controlFlagValue);
AppConfigurationEntry entry = new AppConfigurationEntry(loginModuleClass, controlFlag, new HashMap());
entries.add(entry);
}

return (AppConfigurationEntry[]) entries
.toArray(new AppConfigurationEntry[entries.size()]);
} catch (SQLException e) {
...
}
}

public void refresh() {

}

static LoginModuleControlFlag resolveControlFlag(String name) {
...
if ("REQUIRED".equals(uppedName)) {
return LoginModuleControlFlag.REQUIRED;
} else if ("REQUISITE".equals(uppedName)) {
return LoginModuleControlFlag.REQUISITE;
} else if ("SUFFICIENT".equals(uppedName)) {
return LoginModuleControlFlag.SUFFICIENT;
} else if ("OPTIONAL".equals(uppedName)) {
return LoginModuleControlFlag.OPTIONAL;
} else {
...
}
}
}

Kemudian bagaimana cara menggunakan class yang baru saja kita buat ini? Kita bisa mengeset konfigurasi global dengan cara DbConfiguration.init();. Dengan demikian aplikasi kita akan menggunakan konfigurasi yang sama yaitu DbConfiguration. Berikut contoh main() method

String appName = "
SimpleLoginContext";
// set Configuration
DbConfiguration.init();

// create callback handler
DbCallbackHandler callbackHandler = new DbCallbackHandler();
callbackHandler.setName(username);
callbackHandler.setPassword(password);

LoginContext ctx = new LoginContext(appName, callbackHandler);
...

0 comments:

 

©2009 Stay the Same | by TNB