權限

注意: Permissions 需要使用 Java SecurityManager。Java 版本 17 已將 SecurityManager 標示為即將移除,而 Java 18 及更高版本預設禁止在執行階段設定 SecurityManager。因此,在 Java 18 或更高版本中使用時,Permissions 不再受支援。在這些 Java 執行階段版本中使用它會擲回 org.apache.tools.ant.BuildException。透過將 ant.securitymanager.usage.warn 系統或 Ant 屬性設定為 true,可以放寬 BuildException 的擲回,這會導致記錄警告,而不是擲回例外。即使將 ant.securitymanager.usage.warn 設定為 true,SecurityManager 使用仍會停用,且不會執行任何安全性檢查。建議不再使用 <permissions>

Permissions 代表一組安全性權限,授予或撤銷給在 Apache Ant 執行的 JVM 中執行的特定部分程式碼。實際的 Permissions 是透過一組巢狀權限項目指定,這些項目可以是 <grant>ed 或 <revoke>d。

在基本情況下,會授予 基本組 的權限。可以授予額外的權限。已授予的權限可以透過撤銷權限來推翻。如果受這些權限約束的程式碼嘗試使用尚未授予或已撤銷的權限,則由權限安裝的安全管理員會擲回 SecurityException

巢狀元素

grant

表示總是授予特定權限。其屬性表示授予哪些權限。

屬性 說明 必要
class Permission 類別的完整限定名稱。
name Permission 的名稱。實際內容取決於 Permission 類別。
actions 允許的動作。實際內容取決於 Permission 類別和名稱。

授予隱含權限。

請注意,某些 Permission 類別實際上可能需要名稱和/或動作才能正常運作。名稱和動作是由實際的 Permission 類別解析的。

revoke

表示撤銷特定權限。

屬性 說明 必要
class Permission 類別的完整限定名稱。
name Permission 的名稱。實際內容取決於 Permission 類別。
actions 允許的動作。實際內容取決於 Permission 類別和名稱。

隱含權限不會解析,因此也不會撤銷。

name 可以處理名稱結尾的 * 萬用字元,這種情況下會撤銷指定類別中所有名稱以指定名稱開頭的權限(不包括 *)。請注意,授予的屬性通常支援的 - 萬用字元不受支援。如果 name 留空,則所有名稱都相符,且會被撤銷。如果 actions 留空,則所有動作都相符,且會被撤銷。

基本設定

權限設定隱含包含下列權限

<grant class="java.net.SocketPermission" name="localhost:1024-" actions="listen">
<grant class="java.util.PropertyPermission" name="java.version" actions="read">
<grant class="java.util.PropertyPermission" name="java.vendor" actions="read">
<grant class="java.util.PropertyPermission" name="java.vendor.url" actions="read">
<grant class="java.util.PropertyPermission" name="java.class.version" actions="read">
<grant class="java.util.PropertyPermission" name="os.name" actions="read">
<grant class="java.util.PropertyPermission" name="os.version" actions="read">
<grant class="java.util.PropertyPermission" name="os.arch" actions="read">
<grant class="java.util.PropertyPermission" name="file.encoding" actions="read">
<grant class="java.util.PropertyPermission" name="file.separator" actions="read">
<grant class="java.util.PropertyPermission" name="path.separator" actions="read">
<grant class="java.util.PropertyPermission" name="line.separator" actions="read">
<grant class="java.util.PropertyPermission" name="java.specification.version" actions="read">
<grant class="java.util.PropertyPermission" name="java.specification.vendor" actions="read">
<grant class="java.util.PropertyPermission" name="java.specification.name" actions="read">
<grant class="java.util.PropertyPermission" name="java.vm.specification.version" actions="read">
<grant class="java.util.PropertyPermission" name="java.vm.specification.vendor" actions="read">
<grant class="java.util.PropertyPermission" name="java.vm.specification.name" actions="read">
<grant class="java.util.PropertyPermission" name="java.vm.version" actions="read">
<grant class="java.util.PropertyPermission" name="java.vm.vendor" actions="read">
<grant class="java.util.PropertyPermission" name="java.vm.name" actions="read">

必要時,這些權限可透過 <revoke> 元素撤銷。

範例

<permissions>
  <grant class="java.security.AllPermission"/>
  <revoke class="java.util.PropertyPermission"/>
</permissions>

授予程式碼所有權限,但處理屬性的權限除外。

<permissions>
  <grant class="java.net.SocketPermission" name="foo.bar.com" action="connect"/>
  <grant class="java.util.PropertyPermission" name="user.home" action="read,write"/>
</permissions>

授予基本權限設定,並加上一個 SocketPermission 權限以連線至 foo.bar.com,以及讀取和寫入 user.home 系統屬性的權限。