2

基本的に、私は自己署名 (今のところ) を印刷する Java アプレットを持っています。アプレットに署名せずに印刷することはできますが、ユーザーが Web サイトにアクセスするたびにプロンプ​​トを表示したくありません。最悪の部分は、PrinterJob オブジェクトに対して実行するすべての操作に対してプロンプトが表示されることです。ここで、証明書を受け入れると、印刷プロンプトが表示されなくなります。これは、まさに私が望んでいる動作です。残念ながら、証明書を拒否した場合は、印刷プロンプトを再度受け入れる必要があります。私がやりたいことは、証明書を拒否した場合にアプレットを停止することです。そのために、次のことを試しました。

public void init(){ 
    doPrivileged(new PrivilegedAction<Void>() {
        @Override
        public Void run() {
            _appsm = System.getSecurityManager();
            if (!hasPrintPermissions()) return null;

            printer = new MarketplaceLabelPrinter();
            LOG.info("Initialized");
            return null;
        }
    });
}

/**
 *  Returns true if the applet has enough permissions to print
 */
public boolean hasPrintPermissions(){
    try{
        _appsm.checkPrintJobAccess();
    } catch (SecurityException e) {
        LOG.severe("Not enough priviledges to print.");
        return false;
    }
    return true;
}

これはある程度機能しますが、ユーザーにプロンプ​​トが表示されますが、これは望ましくありません。さらに悪いことに、このセキュリティ チェックはまったく役に立たないということです。なぜなら、[OK] を押しても「このアプレットによるプリンタへのアクセスを常に許可する」をチェックしない場合、セキュリティ チェックはプリンタへのアクセス権があると見なしますが、実際にはそうではありません。(参照: http://i.imgur.com/541YW.png )

要約すると、ユーザーが証明書を拒否した場合、アプレットの実行を停止したいと考えています。

みんな、ありがとう

4

1 に答える 1

2

信頼されていないアプレットでは許可されない何かに対して、try/catch を実行します。疑似コード例

public static boolean isTrusted() {
  boolean trusted = false;
  try {
    SecurityManager sm = System.getSecurityManager();
    // not permitted in a sand-boxed app.
    System.setSecurityManager(null);
    // restore the trusted security manager.
    System.setSecurityManager(sm);
    // This code must be trusted, to reach here.
    trusted = true;
  catch(Throwable ignore) {}
  return trusted;
}
于 2012-07-21T19:04:54.507 に答える