Java 2 Security の振る舞いは、それ自体のセキュリティー・ポリシー で指定されます。 セキュリティー・ポリシーとは、特定のコード・ベースがアクセスできるシステム・リソースを指定し、 そのシステム・リソースへの署名が必要なユーザーを指定するアクセス制御マトリックスです。 Java 2 セキュリティー・ポリシーは、java.security.AccessController.checkPermission メソッドによって実行される宣言です。
i = m;
while (i > 0) {
if (caller i's domain does not have the permission)
throw AccessControlException;
else if (caller i is marked as privileged)
return;
i = i - 1;
};
このアルゴリズムでは、java.security.AccessController.checkPermission メソッドが実行されるときに、 呼び出しスタック上のすべてのクラス (呼び出し元) に許可があることが必要で、 許可がない場合には、その要求は拒否され、java.security.AccessControlException 例外が作成されます。 ただし、呼び出し元が特権 とマークされていて、 そのクラス (呼び出し元) にその許可が付与されている場合、 アルゴリズムは戻り、呼び出しスタック全体が全探索されることはありません。 後続のクラス (呼び出し元) に、必要な許可が付与されている必要はありません。
PasswordUtil ユーティリティー を使用すると、ユーザーのパスワードを変更できます。 ユーティリティーで旧パスワードと新規パスワード (こちらは 2 回) を入力して、正しいパスワードが確実に入力されるようにします。 旧パスワードがパスワード・ファイルに保管されているパスワードと一致した場合、 新規パスワードは保管され、パスワード・ファイルが更新されます。 スタック・フレームに、特権とマークされたものがないと仮定します。 java.security.AccessController.checkPermission アルゴリズムに従うと、 呼び出しスタック上のすべてのクラスにパスワード・ファイルへの書き込み許可が付与されている場合を除いて、アプリケーションは失敗します。 クライアント・アプリケーションには、パスワード・ファイルに直接書き込む許可、 およびパスワード・ファイルを任意に更新する許可がありません。
ただし、PasswordUtil.updatePasswordFile メソッドによって、 パスワード・ファイルにアクセスするコードに 特権のマークが付けられた場合、PasswordUtil クラスに 必要な許可が付与されているかぎり、 許可確認アルゴリズムは、 その許可のために PasswordUtil.updatePasswordFile メソッドを 呼び出すクラスから、 必要な許可を確認することはありません。 クライアント・アプリケーションは、パスワード・ファイルへの書き込み許可を付与しなくても、パスワードの更新を正常に実行できます。
コードに特権とマークする権限は、大変柔軟で強力です。 この権限は正しく使用されないと、 システムのセキュリティー全般が危険にさらされ、 セキュリティー・ホールが露出されることになる可能性があります。 コードに特権とマークする権限を使用する場合は十分に注意を払ってください。