Module java.base
Package java.io

Class FilePermission

所有已实现的接口:
Serializable, Guard

public final class FilePermission extends Permission implements Serializable
该类表示对文件或目录的访问权限。FilePermission由路径名和适用于该路径名的一组操作组成。

路径名是被授予指定操作的文件或目录的路径名。以"/*"结尾的路径名(其中"/"是文件分隔符字符,File.separatorChar)表示该目录中包含的所有文件和目录。以"/-"结尾的路径名表示该目录中(递归地)包含的所有文件和子目录。这样的路径名称为通配符路径名。否则,它是一个简单路径名。

包含特殊标记"<<ALL FILES>>"的路径名匹配任何文件。

注意: 单个"*"组成的路径名表示当前目录中的所有文件,而单个"-"组成的路径名表示当前目录中的所有文件以及(递归地)当前目录中包含的所有文件和子目录。

要授予的操作通过以包含一个或多个逗号分隔关键字的字符串传递给构造函数。可能的关键字是"read"、"write"、"execute"、"delete"和"readlink"。它们的含义定义如下:

read
读权限
write
写权限
execute
执行权限。允许调用Runtime.exec。对应于SecurityManager.checkExec
delete
删除权限。允许调用File.delete。对应于SecurityManager.checkDelete
readlink
读取链接权限。允许通过调用符号链接的目标来读取目标,方法是调用readSymbolicLink 方法。

在处理之前,操作字符串会转换为小写。

在授予FilePermissions时要小心。考虑授予对各种文件和目录的读取和尤其是写入访问权限的影响。具有写入操作的"<<ALL FILES>>"权限尤其危险。这授予了对整个文件系统的写入权限。这实际上允许的一件事是替换系统二进制文件,包括JVM运行时环境。

请注意: 代码始终可以从其所在目录(或该目录的子目录)读取文件;它不需要明确的权限来这样做。

自版本:
1.2
参见:
  • Constructor Details

    • FilePermission

      public FilePermission(String path, String actions)
      创建具有指定操作的新FilePermission对象。 path是文件或目录的路径名,actions包含对文件或目录授予的所需操作的逗号分隔列表。可能的操作是"read"、"write"、"execute"、"delete"和"readlink"。

      以"/*"结尾的路径名(其中"/"是文件分隔符字符,File.separatorChar)表示该目录中包含的所有文件和目录。以"/-"结尾的路径名表示该目录中(递归地)包含的所有文件和子目录。特殊路径名"<<ALL FILES>>"匹配任何文件。

      包含单个"*"的路径名表示当前目录中的所有文件,而包含单个"-"的路径名表示当前目录中的所有文件以及(递归地)当前目录中包含的所有文件和子目录。

      包含空字符串的路径名表示空路径。

      实现注意:
      在此实现中,jdk.io.permissionsUseCanonicalPath系统属性决定如何处理和存储path参数。

      如果系统属性的值设置为truepath将被规范化并存储为名为cpath的String对象。这意味着相对路径将转换为绝对路径,Windows DOS风格的8.3路径将扩展为长路径,符号链接将解析为其目标等。

      如果系统属性的值设置为falsepath将在Path对象命名为npath后进行规范化。不执行规范化,这意味着不访问底层文件系统。如果在转换过程中抛出InvalidPathException,则此FilePermission将被标记为无效。

      在任何情况下,在通配符path的末尾的"*"或"-"字符在规范化或规范化之前被移除。它存储在一个单独的通配符标志字段中。

      在此实现中,jdk.io.permissionsUseCanonicalPath系统属性的默认值为false

      该值也可以使用相同名称的安全属性进行设置,但设置系统属性将覆盖安全属性值。

      参数:
      path - 文件/目录的路径名。
      actions - 操作字符串。
      抛出:
      IllegalArgumentException - 如果操作为null、空、格式错误或包含除指定可能操作之外的操作
  • Method Details

    • implies

      public boolean implies(Permission p)
      检查此FilePermission对象是否"暗示"指定的权限。

      更具体地说,如果满足以下条件,此方法返回true:

      • p是FilePermission的一个实例,
      • p的操作是此对象操作的真子集,并且
      • p的路径名被此对象的路径名所暗示。例如,"/tmp/*"暗示"/tmp/foo",因为"/tmp/*"包含"/tmp"目录中的所有文件,包括名为"foo"的文件。

      简单路径名仅在它们相等时暗示另一个简单路径名。简单路径名永远不会暗示通配符路径名。通配符路径名仅在所有被后者暗示的简单路径名都被前者暗示时才暗示另一个通配符路径名。通配符路径名仅在以下情况下暗示简单路径名:

      • 如果通配符标志为"*",则简单路径名的路径必须正好位于通配符路径名的路径内。
      • 如果通配符标志为"-",则简单路径名的路径必须递归地位于通配符路径名的路径内。

      "<<ALL FILES>>"暗示每个其他路径名。除了"<<ALL FILES>>"本身外,没有任何路径名暗示"<<ALL FILES>>"。

      指定者:
      implies 在类 Permission
      实现注意:
      如果jdk.io.permissionsUseCanonicalPathtrue,则简单cpath仅在从前者中删除基本名称(路径名的名称序列中的最后一个名称)后,剩余部分等于后者时才在通配符cpath内,简单cpath仅在从前者开始时才递归在通配符cpath内。

      如果jdk.io.permissionsUseCanonicalPathfalse,则简单npath仅在 simple_npath.relativize(wildcard_npath)恰好为".."时才在通配符npath内,简单npath仅在simple_npath.relativize(wildcard_npath)是一个或多个".."的系列时才递归在通配符npath内。这意味着"/-"暗示"/foo"但不暗示"foo"。

      无效的FilePermission不暗示任何对象,除了它自身。无效的FilePermission不被任何对象暗示,除了它自身或一个对"<<ALL FILES>>"的FilePermission,其操作是此无效FilePermission的超集。即使两个FilePermission使用相同的无效路径创建,一个也不暗示另一个。

      参数:
      p - 要检查的权限。
      返回:
      如果指定的权限不为null且被此对象暗示,则返回true,否则返回false
    • equals

      public boolean equals(Object obj)
      检查两个FilePermission对象是否相等。检查obj是否为FilePermission,并且具有与此对象相同的路径名和操作。
      指定由:
      equals 在类 Permission
      实现说明:
      更具体地说,当且仅当两个路径名具有相同的通配符标志并且它们的cpath(如果jdk.io.permissionsUseCanonicalPathtrue)或npath(如果jdk.io.permissionsUseCanonicalPathfalse)相等时,两个路径名才相同。或者它们都是"<<ALL FILES>>"。

      jdk.io.permissionsUseCanonicalPathfalse时,一个无效的FilePermission除了自身之外不等于任何对象,即使它们是使用相同的无效路径创建的。

      参数:
      obj - 我们正在测试与此对象相等性的对象。
      返回:
      如果obj是一个FilePermission,并且具有与此FilePermission对象相同的路径名和操作,则返回true,否则返回false
      参见:
    • hashCode

      public int hashCode()
      返回此对象的哈希码值。
      指定由:
      hashCode 在类 Permission
      返回:
      此对象的哈希码值。
      参见:
    • getActions

      public String getActions()
      返回操作的“规范字符串表示”。也就是说,此方法始终以以下顺序返回当前操作:读取、写入、执行、删除、读取链接。例如,如果此FilePermission对象允许写入和读取操作,调用getActions将返回字符串"read,write"。
      指定由:
      getActions 在类 Permission
      返回:
      操作的规范字符串表示。
    • newPermissionCollection

      public PermissionCollection newPermissionCollection()
      返回一个用于存储FilePermission对象的新PermissionCollection对象。

      FilePermission对象必须以一种允许它们以任何顺序插入到集合中的方式存储,但同时也使得PermissionCollection的implies方法能够以高效(且一致)的方式实现。

      例如,如果您有两个FilePermissions:

      1. "/tmp/-", "read"
      2. "/tmp/scratch/foo", "write"

      并且您正在使用FilePermission调用implies方法:

           "/tmp/scratch/foo", "read,write",
       
      那么implies函数必须考虑到"/tmp/-"和"/tmp/scratch/foo"权限,因此有效权限是"read,write",implies返回true。通过此newPermissionCollection方法返回的PermissionCollection对象正确处理FilePermissions的"implies"语义。
      覆盖:
      newPermissionCollection 在类 Permission
      返回:
      适用于存储FilePermissions的新PermissionCollection对象。