java.security.AccessControlException: доступ запрещен ("java.lang.RuntimePermission" "loadLibrary.jpcap")
У меня есть приложение для школьного проекта, в котором есть классы jpcap, и я получаю следующие исключения при попытке запустить файл jar:
java.lang.ExceptionInInitializerError
...
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "loadLibrary.jpcap")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at sun.plugin2.applet.FXAppletSecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkLink(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at jpcap.JpcapCaptor.<clinit>(JpcapCaptor.java:251)
... 12 more
Есть ли способ разрешить мой код без добавления:
grant { permission java.security.AllPermission; };
jre расположение \lib\security\java.policy?
1 ответ
Для всех вас, у кого есть такая же проблема:
Во-первых, вам нужно будет добавить
MANIFEST.MF
файл в ваш апплет. Проверьте: Самый простой способ добавить атрибут в манифест jar в Maven, чтобы подписать и добавить файл манифеста в апплет. Убедитесь, что эта конфигурация не переопределена в конфигурациях параметров апплета.Java 8+ требует подписанных апплетов, поэтому вам придется подписать свой апплет. Если вы находитесь в среде разработки, вам придется самостоятельно подписать свой апплет и добавить этот сертификат в панель управления Java. Посмотрите , как можно добавить самоподписанные сертификаты в список доверенных сертификатов во время выполнения Java.
Даже после этого есть код, который будет работать только с
PrivilegedActions
, Смотрите этот ответ: /questions/47491210/vyizov-dll-iz-appleta-cherez-jni/47491215#47491215.
В любом случае, вот как я это сделал, я использовал этот минимальный Java-апплет, созданный с помощью Maven, в качестве базового проекта.
MANIFEST.MF
Manifest-Version: 1.0
Application-Name: One Applet
Codebase: *
Permissions: all-permissions
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
Trusted-Only: false
Trusted-Library: false
pom.xml
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<index>true</index>
<manifestFile>${project.basedir}/MANIFEST.MF</manifestFile>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jarsigner-plugin</artifactId>
<version>1.2</version>
<configuration>
<keystore>src/main/resources/minimal-keystore.jks</keystore>
<alias>minimal</alias>
<storepass>abcd1234</storepass>
<keypass>abcd1234</keypass>
</configuration>
<executions>
<execution>
<id>sign</id>
<goals>
<goal>sign</goal>
</goals>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
minimal.cer
keytool -export -keystore minimal-keystore.jks -alias minimal -file minimal.cer
SomeClass.java
try {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
try {
for (String dll : dlls) {
String dllPath = basePath + dll;
System.out.println("Cargando: " + dllPath);
System.load(dllPath);
}
return null;
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
});
} catch (Exception e) {
e.printStackTrace();
throw e;
}
Ну вот и все!