Java檔案所有者許可權


在Java中,有三種方法可以管理檔案所有者:

  • 使用Files.getOwner()Files.setOwner()方法。
  • 使用「owner」作為屬性名稱的Files.getAttribute()Files.setAttribute()方法。
  • 使用FileOwnerAttributeView

需要使用UserPrincipalGroupPrincipal介面來管理檔案的所有者。檔案的所有者可以是使用者或組。UserPrincipal表示使用者,GroupPrincipal表示組。
當讀取檔案的所有者時,得到一個UserPrincipal的範例。呼叫UserPrincipal物件上的getName()方法以獲取使用者的名稱。

要設定檔案的所有者,請從使用者名獲取UserPrincipal的物件。

要從檔案系統獲取UserPrincipal,請使用UserPrincipalLookupService類的範例,可以使用FileSystem類的getUserPrincipalLookupService()方法獲取該範例。

以下程式碼為使用者ID為myName的使用者獲取一個UserPrincipal物件:

FileSystem fs  = FileSystems.getDefault();
UserPrincipalLookupService upls  = fs.getUserPrincipalLookupService();

UserPrincipal user = upls.lookupPrincipalByName("myName"); 
System.out.format("User principal name is %s%n", user.getName());

以下程式碼顯示如何使用FileOwnerAttributeView更改檔案的所有者。

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileOwnerAttributeView;
import java.nio.file.attribute.UserPrincipal;
import java.nio.file.attribute.UserPrincipalLookupService;

public class Main {
  public static void main(String[] args) throws Exception {

      Path path = Paths.get("C:\\Java_Dev\\test1.txt");

      FileOwnerAttributeView foav = Files.getFileAttributeView(path,
          FileOwnerAttributeView.class);

      UserPrincipal owner = foav.getOwner();
      System.out.format("Original owner  of  %s  is %s%n", path,
          owner.getName());

      FileSystem fs = FileSystems.getDefault();
      UserPrincipalLookupService upls = fs.getUserPrincipalLookupService();

      UserPrincipal newOwner = upls.lookupPrincipalByName("brice");
      foav.setOwner(newOwner);

      UserPrincipal changedOwner = foav.getOwner();
      System.out.format("New owner  of  %s  is %s%n", path,
          changedOwner.getName());

  }
}

以下程式碼使用Files.setOwner()方法更新在Windows上使用路徑C:\Java_Dev\test1.txt標識的檔案的所有者:

UserPrincipal owner  = get   the   owner;
Path  path   = Paths.get("C:\\Java_Dev\\test1.txt"); 
Files.setOwner(path,  owner);

ACL檔案許可權

Microsoft Windows上支援ACL型別檔案屬性。ACL由存取控制條目的有序列表組成。每個條目由一個UserPrincipal,存取型別和對物件的存取級別組成。AclEntry類表示ACL中的條目。

使用AclFileAttributeViewgetAcl()setAcl()方法獲取和設定檔案的AclEntry列表。

以下程式碼獲取名為 C:\Java_Dev\test1.txt 的檔案的ACL條目列表:

Path  path   = Paths.get("C:\\Java_Dev\\test1.txt"); 
AclFileAttributeView view  = Files.getFileAttributeView(path,  AclFileAttributeView.class); 
List<AclEntry> aclEntries = view.getAcl();

AclEntry類可以讀取ACL條目的各種屬性。 其principal()方法返回UserPrincipal以標識使用者或組。AclEntrypermissions()返回一組AclEntryPermission物件以標識許可權。
AclEntrytype()方法返回型別AclEntryType的列舉常數,例如ALARMALLOWAUDIT``和DENY,用於指示存取型別。
AclEntryflags()方法返回一組AclEntryFlag列舉常數,其中包含ACL條目的繼承標誌。

以下程式碼顯示如何讀取檔案 C:\Java_Dev\test1.txt 的ACL條目。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclFileAttributeView;
import java.util.List;
import java.util.Set;

public class Main {
  public static void main(String[] args) throws Exception {
    Path path = Paths.get("C:\\Java_Dev\\test1.txt");
    AclFileAttributeView aclView = Files.getFileAttributeView(path,
        AclFileAttributeView.class);
    if (aclView == null) {
      System.out.format("ACL view  is not  supported.%n");
      return;
    }
    List<AclEntry> aclEntries = aclView.getAcl();
    for (AclEntry entry : aclEntries) {
      System.out.format("Principal: %s%n", entry.principal());
      System.out.format("Type: %s%n", entry.type());
      System.out.format("Permissions are:%n");

      Set<AclEntryPermission> permissions = entry.permissions();
      for (AclEntryPermission p : permissions) {
        System.out.format("%s %n", p);
      }

    }

  }
}

範例

以下程式碼顯示如何為名為brice的使用者新增新的ACL條目。 它在 C:\Java_Dev\test1.txt 檔案中為使用者新增DATA_READDATA_ WRITE許可權。

import static java.nio.file.attribute.AclEntryPermission.READ_DATA;
import static java.nio.file.attribute.AclEntryPermission.WRITE_DATA;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.AclEntry;
import java.nio.file.attribute.AclEntryPermission;
import java.nio.file.attribute.AclEntryType;
import java.nio.file.attribute.AclFileAttributeView;
import java.nio.file.attribute.UserPrincipal;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;

public class Main {
  public static void main(String[] args) throws Exception {
    Path path = Paths.get("C:\\Java_Dev\\test1.txt");

    AclFileAttributeView aclView = Files.getFileAttributeView(path,
        AclFileAttributeView.class);
    if (aclView == null) {
      System.out.format("ACL view  is not  supported.%n");
      return;
    }
    UserPrincipal bRiceUser = FileSystems.getDefault()
        .getUserPrincipalLookupService().lookupPrincipalByName("brice");

    Set<AclEntryPermission> permissions = EnumSet.of(READ_DATA, WRITE_DATA);

    AclEntry.Builder builder = AclEntry.newBuilder();
    builder.setPrincipal(bRiceUser);
    builder.setType(AclEntryType.ALLOW);
    builder.setPermissions(permissions);
    AclEntry newEntry = builder.build();

    List<AclEntry> aclEntries = aclView.getAcl();

    aclEntries.add(newEntry);

    aclView.setAcl(aclEntries);
  }
}

POSIX檔案許可權

UNIX支援POSIX標準檔案屬性。POSIX檔案許可權由九個元件組成:

  • 三個為所有者
  • 三個為所在使用者組
  • 三個為其它

這三種型別的許可權分別是:讀,寫和執行。

典型POSIX的字串形式檔案許可權看起來像「rw-rw----」,它表示所有者和組的讀取和寫入許可權。PosixFilePermission列舉型別定義九個常數,每個許可權元件一個。九個常數命名為X_Y,其中X是OWNERGROUPOTHERSYREADWRITEEXECUTE

PosixFilePermissions是一個實用程式類,它將檔案的POSIX許可權從一種形式轉換為另一種形式的方法。
它的toString()方法將一組PosixFilePermission列舉常數轉換為rwxrwxrwx形式的字串。它的fromString()方法將rwxrwxrwx形式的字串中的POSIX檔案許可權轉換為一組PosixFilePermission列舉常數。它的asFileAttribute()方法將一組PosixFilePermission列舉常數轉換為FileAttribute物件。

以下程式碼是在預設目錄中一個名稱為test的檔案夾的rwxrwxrwx格式讀取和列印POSIX檔案許可權:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFileAttributeView;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class Main {
  public static void main(String[] argv)throws Exception {
    Path path = Paths.get("test");
    PosixFileAttributeView posixView = Files.getFileAttributeView(path,
        PosixFileAttributeView.class);
    PosixFileAttributes attribs = posixView.readAttributes();
    Set<PosixFilePermission> permissions = attribs.permissions();
    // Convert the file permissions into the rwxrwxrwx string form
    String rwxFormPermissions = PosixFilePermissions.toString(permissions);
    // Print the permissions
    System.out.println(rwxFormPermissions);
  }
}

要更新POSIX檔案許可權,請呼叫PosixFileAttributeViewsetPermissions()方法,將PosixFilePermission列舉常數的Set作為引數傳遞。

以下程式碼顯示如何設定POSIX檔案許可權:

String rwxFormPermissions = "rw-r-----";
Set<PosixFilePermission> permissions = PosixFilePermissions.fromString(rwxFormPermissions);

posixView.setPermissions(permissions);

以下程式碼直接建立一組PosixFilePermission列舉常數,並將其設定為檔案許可權。

Set<PosixFilePermission> permissions = EnumSet.of(OWNER_READ,  OWNER_WRITE, GROUP_READ);
posixView.setPermissions(permissions);

以下程式碼演示如何在類似UNIX的平台上讀取和更新名為test的檔案的POSIX檔案許可權(註:最好在Linux/Unix作業系統上執行)。

import static java.nio.file.attribute.PosixFilePermission.GROUP_READ;
import static java.nio.file.attribute.PosixFilePermission.OWNER_READ;
import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFileAttributeView;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.EnumSet;
import java.util.Set;

public class Main {
  public static void main(String[] args) throws Exception {
    Path path = Paths.get("test");
    PosixFileAttributeView posixView = Files.getFileAttributeView(path,
        PosixFileAttributeView.class);
    if (posixView == null) {
      System.out.format("POSIX attribute view  is not  supported%n.");
      return;
    }
    readPermissions(posixView);
    updatePermissions(posixView);
  }

  public static void readPermissions(PosixFileAttributeView posixView)
      throws Exception {
    PosixFileAttributes attribs;
    attribs = posixView.readAttributes();
    Set<PosixFilePermission> permissions = attribs.permissions();
    // Convert the set of posix file permissions into rwxrwxrwx form
    String rwxFormPermissions = PosixFilePermissions.toString(permissions);
    System.out.println(rwxFormPermissions);
  }
  public static void updatePermissions(PosixFileAttributeView posixView)
      throws Exception {
    Set<PosixFilePermission> permissions = EnumSet.of(OWNER_READ, OWNER_WRITE,
        GROUP_READ);
    posixView.setPermissions(permissions);
    System.out.println("Permissions set successfully.");
  }
}

上面的程式碼生成以下結果。

POSIX attribute view  is not  supported
.