使用 Java 检查 Linux 用户的组成员身份



嗨,我不知道如何使用java 7 nio库验证用户是否属于Linux操作系统下的一个或多个组。

谁能帮我解决这个问题?

您可以尝试读取文件/etc/group

我开发了一个类来轻松查询此文件:

public class UserInfo {
    public UserInfo() throws FileNotFoundException, IOException {
        this.group2users = new HashMap<>();
        FileReader fileReader = new FileReader(groupsFilePath);
        BufferedReader groupsReader = new BufferedReader(fileReader);
        while(groupsReader.ready())
        {
            try
            {
                String line = groupsReader.readLine();
                String [] tokens = line.split(":");
                String groupName = tokens[0];
                Set<String> users = group2users.get(groupName);
                if(users == null)
                {
                    users = new HashSet<String>();
                    group2users.put(groupName, users);
                }
                if(tokens.length>3)
                {
                    for(String uStr: tokens[3].split(","))
                        users.add(uStr);
                }
            } catch (Exception e) { continue; }
        }
        groupsReader.close();
        fileReader.close();
    }
    public boolean belongs2group(String user, String group)
    {
        Set<String> groupRef = group2users.get(group);
        if(groupRef == null) return false;
        return groupRef.contains(user);
    }
    private String groupsFilePath = "/etc/group";
    private Map<String, Set<String>> group2users;
}

此代码映射/etc/group文件并保留组映射 - 其用户设置。我只开发了一种查询方法(belongs2group),但是添加方法来列出所有组和/或所有用户相当容易。

这段代码是使用老式的主流java io-api编写的,但我认为它可以很容易地适应nio。如果您需要我完成该步骤,请告诉我。

我不认为阅读本地/etc/passwd/etc/group可能是个好主意,因为nis/ldap/ipa/pa可以引入有关组成员资格的其他信息来源。因此,这取决于您的环境和其他一些细节。例如:

已登录(当前)用户的组

  com.sun.security.auth.module.UnixSystem().getGroups()

Hadoop

  org.apache.hadoop.security.UserGroupInformation.getBestUGI(null,"root").getGroupNames()

如果两者都不是

你可以为 getgroups(2) 创建 jna 包装器。

或者 jdk 改进 UnixSystem 和 Java_com_sun_security_auth_module_UnixSystem_getUnixInfo 以采用用户 id/name 参数。

或者重写org.apache.hadoop.security.GroupMappingServiceProvider接口的一些实现,使其不依赖于Hadoop环境。

相关内容

  • 没有找到相关文章

最新更新