Saya memiliki aplikasi jnlp sederhana yang mendemonstrasikan panggilan asinkron Java 8, dan mengakses data hak istimewa, misalnya System.getProperties(). Saya telah memberikannya izin penuh dalam file jnlp, dan kode tersebut ditandatangani dengan benar dengan sertifikat CA Root yang tepat, tetapi kode tersebut masih memberikan pengecualian. Saya tidak dapat menemukan apa pun yang dapat menjelaskan atau menyelesaikan masalah ini, dan sejauh yang saya tahu, semua izin yang diperlukan telah diberikan. Adakah yang bisa membantu?

Kode:

package com.text;
import java.util.Properties;
import java.util.concurrent.*;

public class LambaTest {
    public static void main(String args[]) {
        CompletableFuture<String> test = CompletableFuture.supplyAsync( () -> {
        try {
                System.out.println("Asynchronous Thread");
                Properties properties = System.getProperties();
                System.out.println("https.protocols="+properties.get("https.protocols"));
                System.out.println("Asynchronous Thread successful");
                return "Hello";
            } catch(Exception e) {
                System.out.println("Asynchronous Thread FAILED");
                e.printStackTrace();
            }
            return null;
        });

        test.thenAccept(string -> {
            System.out.println("Priting String within async call " + string);
        });

        try{
            System.out.println("Main Thread");
            Properties properties = System.getProperties();
            System.out.println("https.protocols="+properties.get("https.protocols"));
            System.out.println("Main Thread successful");
        } catch (Exception er) {
            System.out.println("Main Thread FAILED");
            er.printStackTrace();
        }
    }
}

Ini adalah deskriptor jnlp:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
  codebase="http://localhost/"
  href="test_uat.jnlp"
>
<information>
  <title>TEST - uat</title>
  <vendor>TESTing service</vendor>
  <homepage href="http://localhost/" />
  <description>JNLP Test scripts</description>
  <offline-allowed/>
</information>
<security>
  <all-permissions/>
</security>
<resources>
  <j2se version="1.8+" />
  <jar href="Test-1.0-SNAPSHOT.jar" download="eager" main="true"/>
</resources>
<application-desc main-class="com.test.LambaTest">
    <argument>empty</argument>
</application-desc>
</jnlp>

Dan ini adalah output konsol:

Asynchronous Thread
Asynchronous Thread FAILED
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "*" "read,write")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at com.sun.javaws.security.JavaWebStartSecurity.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPropertiesAccess(Unknown Source)
    at java.lang.System.getProperties(Unknown Source)
    at com.test.LambaTest.lambda$main$0(LambaTest.java:17)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(Unknown Source)
    at java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(Unknown Source)
    at java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
    at java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Priting String within async call null
Main Thread
https.protocols=TLSv1.2,TLSv1.1,TLSv1
Main Thread successful
1
Vy Tran 10 Januari 2018, 20:01

1 menjawab

Jawaban Terbaik

Untuk eksekusi biasa, izin metode adalah persimpangan izin semua metode pada tumpukan panggilan saat ini.

Jadi, jika kumpulan utas yang memanggil kode Anda memiliki izin lebih sedikit daripada kode Anda atau bahkan tidak memiliki izin sama sekali, kode Anda memiliki lebih sedikit atau bahkan tidak memiliki izin dalam konteks panggilan itu.

Ini memastikan bahwa metode yang tidak memiliki hak tidak dapat begitu saja melakukan tindakan istimewa dengan memanggil metode istimewa yang tidak diketahui. Metode yang diistimewakan bertanggung jawab untuk memverifikasi argumen pemanggil, melakukan pemeriksaan keamanannya sendiri jika tindakan tersebut dianggap relevan dengan keamanan, lalu memanggil AccessController.doPrivileged(…) secara eksplisit untuk menyatakan bahwa hak istimewa penelepon tidak langsung tidak boleh dipertimbangkan. Jika itu tidak terjadi, penelepon yang tidak memiliki hak tetap tidak dapat menyalahgunakan metode untuk meningkatkan haknya.

public class LambdaTest {
    public static void main(String args[]) {
        CompletableFuture<String> test = CompletableFuture.supplyAsync(() -> {
            System.out.println("Asynchronous Thread");
            PrivilegedAction<Properties> action = System::getProperties;
            Properties properties = AccessController.doPrivileged(action);
            System.out.println("https.protocols="+properties.get("https.protocols"));
            return "hello";
        }).whenComplete((string, throwable) -> {
            if(throwable != null) {
                System.err.println("async action failed");
                throwable.printStackTrace();
            }
            else System.out.println("Async call returned " + string);
        });

        try{
            System.out.println("Main Thread");
            Properties properties = System.getProperties();
            System.out.println("https.protocols="+properties.get("https.protocols"));
            System.out.println("Main Thread successful");
        } catch (Exception er) {
            System.out.println("Main Thread FAILED");
            er.printStackTrace();
        }
        test.join();
    }
}

Omong-omong, ketika Anda ingin mendapatkan satu properti, Anda harus menggunakan System.getProperty(String) sebagai gantinya. Sebagai System.getProperties() menyatakan:

Perhatikan bahwa bahkan jika manajer keamanan tidak mengizinkan operasi getProperties, ia dapat memilih untuk mengizinkan operasi getProperty(String).

1
Holger 10 Januari 2018, 17:48