Previous | Next | Trail Map | Custom Networking and Security | 自前のセキュリティマネージャを用意する


セキュリティマネージャをインストールする

SecurityManager サブクラスを書き終えたら、自分の Java アプリケーションの現在 のセキュリティマネージャとしてインストールすることができる。これを行うには、 System クラスの setSecurityManager() メソッドを使用する。

ここで、前のページに示した PasswordSecurityManager クラスを現在のセキュリティマネージャとしてインストー ルする、SecurityManagerTest という名前の簡単なテストアプリケーションを示す。この SecurityManagerTest ア プリケーションは、セキュリティマネージャが適切な場所にあり、使用可能であ ることを確認するため、2 つのファイルを開く。1 つは読み取り用、もう 1 つは書 き込み用である。そして、1 番目のファイルの中身を 2 番目のファイルにコピーす る。

main() メソッドは初めに、新規のセキュリティマネージャをインスト ールする。

try {
    System.setSecurityManager(new PasswordSecurityManager("Booga 
Booga"));
} catch (SecurityException se) {
    System.out.println("SecurityManager already set!");
}

上記のコード片の太字の行は、"Booga Booga" というパスワードで PasswordSecurityManager クラスの新規のインスタンスを作成している。 このイン スタンスは System の setSecurityManager() メソッドに渡され、こ のメソッドは、実行中のアプリケーションの現在のセキュリティマネージャとしてオ ブジェクトをインストールする。このセキュリティマネージャは、このアプリケーションが実行している間、有効である。

自分のアプリケーションにセキュリティマネージャを設定できるのは 1 回だけであ る。言い換えると、Java アプリケーションはその生存期間中に System.setSecurityManager() を 1 回だけ起動できるということであ る。Java アプリケーションの中でそれ以降にセキュリティマネージャをインストー ルしようとすると、SecurityException があげられる。

プログラムの後半部では、この inputtext.txt ファイルの中身を outputtext.txt という 名前の出力ファイルにコピーする。これは、PasswordSecurityManager が正しくイン ストールされたことを確かめる、簡単なテストである。

try {
 DataInputStream fis = new DataInputStream(new 
FileInputStream("inputtext.txt"));
    DataOutputStream fos = new DataOutputStream(new 
FileOutputStream("outputtext.txt"));
    String inputString;
    while ((inputString = fis.readLine()) != null) {
        fos.writeBytes(inputString);
        fos.writeByte('¥n');
    }
    fis.close();
    fos.close();
} catch (IOException ioe) {
    System.err.println("I/O failed for SecurityManagerTest.");
}

上記のコード片の太字の行は、限定されたファイルシステムアクセスの部分である。 これらのメソッド呼び出しにより、PasswordSecurityManager の checkAccess() メソッドが呼び出される。

テストプログラムを実行する

SecurityManagerTest アプリケーションを実行するとき、パスワード入力を求めるプ ロンプトが 2 回表示される。1 回はアプリケーションが入力ファイルを開くとき、 もう 1 回はアプリケーションが出力ファイルを開くときである。 正しいパスワードを入力すれば、アクセス (ファイルオブジェクト) が与えられ、ア プリケーションは次の文へ進む。パスワードが誤っていると、 checkXXX() が SecurityException をあげるが、このテストアプリケ ーションはこの例外をキャッチしようとせず、終了する。

次に示すのは、1 回目には正しいパスワードを入力し、2 回目には誤ったパスワード を入力した場合の、アプリケーションの出力例である。

What's the secret password?
Booga Booga
What's the secret password?
Wrong password
java.lang.SecurityException: Not Even!
        at PasswordSecurityManager.checkWrite(PasswordSecurityManager.java:46)
        at java.io.FileOutputStream.(FileOutputStream.java)
        at SecurityManagerTest.main(SecurityManagerTest.java:15)

アプリケーションが出力するエラーメッセージは、 checkWrite(String) メソッドに対するエラーメッセージであることに 注意する。

参照

java.lang.System


Previous | Next | Trail Map | Custom Networking and Security | 自前のセキュリティマネージャを用意する