我正在编写一个Java考勤程序供课堂使用;我的目标是让学生能够将课程文件下载到他们的帐户(我们将在同一网络上工作),然后使用他们的用户名和密码进行日常运行。我的程序运行良好,但我遇到了一个我似乎无法克服的错误。
当它在任何一天第一次运行时,attend.java将在我的帐户的指定目录中创建一个新的文本文件,然后将运行该程序的用户的用户名追加到文件中(目前它只是追加第一个参数该程序的文件,但我希望修改它,使其更准确,没有人可以给一个虚假的用户名),从而编写一份学生名单。
例如,运行:
>> java attend desadams cheesecake将采用给定的密码“芝士蛋糕”,如果它匹配当天的密码,可以创建一个名为“(今日的日期).txt”的新文本文件并将用户名“desadams”写入它(如果它当天第一次运行)或简单地将用户名“desadams”附加到先前存在的“(今天的日期).txt”文件中。
我编写了自己的createFile()方法,该方法利用java.nio.file包创建一个具有自定义权限的文件:
public static void createFile(File file) throws IOException{
Path newFile = file.toPath();
//create new file and set permissions
/* For the purposes of this program, the new file (the attendance list) must readable and writable to everbody
* in order for this program to work properly when run from their user, because this program both reads and modif\
ies.
*/
Set perms = PosixFilePermissions.fromString("rwxrw-");
Files.createFile(newFile);
Files.setPosixFilePermissions(newFile, perms);
//set owner
UserPrincipal owner = newFile.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByName("desadams");
Files.setOwner(newFile, owner);
//set group
GroupPrincipal group = newFile.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByGroupName("studen\
ts");
Files.getFileAttributeView(newFile, PosixFileAttributeView.class).setGroup(group);
}我无法同时创建该文件并设置权限,因为该帐户的umask会妨碍您的工作,所以我通过两个步骤完成了工作,并且工作正常。
现在我们遇到了我的问题:我可以从我自己的帐户编译和运行该程序,但是为了从其他帐户运行它,我将setOwner()方法更改为使用任意用户名代替我自己更好地模拟从另一个帐户运行程序的条件。它失败了。试图将所有者设置为运行程序的人以外的任何人都会导致“操作不允许”错误。
我已经知道UNIX命令chown将无法工作,因为没有任何网络帐户可以访问root帐户,但我没有想到它会阻止Java做同样的事情,但我认为它确实有道理。
无论如何都可以解决这个问题吗?最简单的方法当然是每天在其他人面前自己运行程序,这样出勤文件就以我自己的用户名创建,然后我不必担心要确保将所有者设置为我的程序本身的用户名;它总会找到出席文件,因此不必使用适当的文件属性来创建它。然而,尽管这可能正是我所做的,但我想知道是否有人有解决方案,建议如何在程序中设置所有者。
谢谢,对不起,这是一个很长的帖子。