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
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:
Post a Comment