自前のセキュリティマネージャを用意する |
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) メソッドに対するエラーメッセージであることに 注意する。
参照
自前のセキュリティマネージャを用意する |