2014-10-31 77 views
0

我正在尝试执行文件操作,这取决于我的java web应用程序中登录的用户。为此,我使用JNI本地实现将fs uid & fs gid设置为登录用户的uid和gid。现在,仅当登录用户具有权限时才允许文件操作。linux访问系统调用不按预期方式工作

我也想检索登录的用户是否具有对文件的读/写/执行权限。试图使用access,faccessat系统调用,但他们似乎没有使用fs uid。

如何获取登录用户的文件权限?

+0

一个相关的问题 - http://stackoverflow.com/questions/1223600/change-uid-gid-only-of-one-thread-in-linux。但是,解决方案不会告诉如何获取文件权限。在尝试之前,我需要能够检测是否可以进行操作。 – user3911119 2014-11-01 04:22:53

+0

如果setuid设置为登录用户,无法重置原始uid。看起来像没有办法做到:( – user3911119 2014-11-01 19:27:49

回答

0

找到解决问题的简单方法。不知道它有多完整。它不考虑帐户。

struct passwd *pw = getpwnam(userName); 
if (pw == NULL) { 
    return NULL; 
} 
jint fill[3];//rwx - 1 indicates success, 0 indicates failure 
if(pw->pw_uid == 0) { 
    fill[0] = fill[1] = fill[2] = 1; 
} else { 
    struct stat info; 
    stat(path, &info); 
    int mode = info.st_mode; 

    if(pw->pw_uid == info.st_uid) { 
     fill[0] = mode & S_IRUSR ? 1 : 0; /* 3 bits for user */ 
     fill[1] = mode & S_IWUSR ? 1 : 0; 
     fill[2] = mode & S_IXUSR ? 1 : 0; 
    } else if(pw->pw_gid == info.st_gid) { 
     fill[0] = mode & S_IRGRP ? 1 : 0; /* 3 bits for group */ 
     fill[1] = mode & S_IWGRP ? 1 : 0; 
     fill[2] = mode & S_IXGRP ? 1 : 0; 
    } else { 
     fill[0] = mode & S_IROTH ? 1 : 0; /* 3 bits for group */ 
     fill[1] = mode & S_IWOTH ? 1 : 0; 
     fill[2] = mode & S_IXOTH ? 1 : 0; 
    } 
}