您好我无法弄清楚如何使用java 7 nio库验证用户是否属于Linux OS下的一个或多个组。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
您可以尝试阅读文件/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。如果您需要我完成该步骤,请告诉我。
答案 1 :(得分:0)
我认为阅读本地/etc/passwd
或/etc/group
并不是一个好主意,因为nis / ldap / ipa / pam可以引入有关组成员身份的其他信息来源。
因此,这取决于您的环境和其他一些细节。例如:
已登录(当前)用户的组
com.sun.security.auth.module.UnixSystem().getGroups()
Hadoop
org.apache.hadoop.security.UserGroupInformation.getBestUGI(null,"root").getGroupName()
如果您不这样做
您可以为getgroups(2)创建jna包装器。
从jdk或改进 UnixSystem和Java_com_sun_security_auth_module_UnixSystem_getUnixInfo
以获取用户ID /名称参数。
或者重写org.apache.hadoop.security.GroupMappingServiceProvider
接口的某些实现以不依赖于hadoop环境。