Как найти группы на основе uid при использовании двух разных списков массивов?

#java #json #arraylist

#java #json #список массивов

Вопрос:

Используя Java 1.8 и Spring Boot 1.5.6.RELEASE.

Я могу получить список элементов из, проанализировав /etc/ passwd и / etc / group внутри ArrayList amp; ArrayList.


Необходимо создать следующую конечную точку Rest:

 HTTP GET /users/<uid>/groups
  

Верните все группы для данного пользователя.


Пользователь:

 public class User {

    String name;
    String password;
    Integer uid;
    Integer gid;
    String comment;
    String home;
    String shell;

    public User(String line) {
        String[] items = line.split(":");

        if (items.length != 7) {
            throw new IllegalArgumentException("Need 7 items from "   line   " and there's only: "   items.length);
        }

        this.name = items[0];
        this.password = items[1];
        this.uid = Integer.parseInt(items[2]);
        this.gid = Integer.parseInt(items[3]);
        this.comment = items[4];
        this.home = items[5];
        this.shell = items[6];
    }

    // Getters amp; Setters omitted for brevity.
}
  

Группа:

 public class Group {
    private Integer gid;
    private String name;
    private List<String> members;

    public Group(String line) {
        String[] items = line.split(":");

        this.name = items[0];
        this.gid = Integer.parseInt(items[2]);

        if (items.length > 3){
            this.members = Arrays.asList(items[3]);
        }
    }   

    // Getters amp; Setters omitted for brevity.
}   
  

FileParserUtils:

 public class FileParserUtils {

    public static List<Group> parseFileForGroups(String line) {
        List<Group> groups = null;
        try (Stream<String> stream = Files.lines(Paths.get(line))) {

            groups = stream.filter(s -> s.charAt(0) != '#').map(Group::new)
                    .collect(Collectors.toCollection(LinkedList::new));
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
        return groups;
    }
}
  

Обслуживание:

 @Service
public class UserServiceImpl implements UserService {   

    @Override
    public User findByUid(String line, Integer uid) {
        List<User> allUsers = FileParserUtils.parseFileForUsers(line);
        for (User user : allUsers) {
            if (user.getUid() == uid) {
                return user;
            }
        }
        return null;
    }

    @Override
    public List<Group> findByGroupsByUid(String line, Integer uid) {
        User specificUser = findByUid(line, uid);
        Integer userGid = specificUser.getGid();        
        List<Group> allGroups = FileParserUtils.parseFileForGroups(line);
        List<Group> userGroups = new ArrayList<>();
        for (Group group : allGroups) {
            if (userGid == group.getGid()) {
                userGroups.add(group);
            }
        }
        return userGroups;
    }
}
  

This issue is that not all User uids are the same as the Group’s gids (see the gids amp; uids for "name":"_cyrus" ):

Obtain a list of Users (along with their uids amp; gids):

 HTTP GET /myservice/users:
  

Yields JSON Payload Response:

 [  
    {  
        "name":"_cyrus",
        "password":"*",
        "uid":77,
        "gid":6,
        "comment":"Cyrus Administrator",
        "home":"/var/imap",
        "shell":"/usr/bin/false"
    },
    {  
        "name":"_mailman",
        "password":"*",
        "uid":78,
        "gid":78,
        "comment":"Mailman List Server",
        "home":"/var/empty",
        "shell":"/usr/bin/false"
    },
    {  
        "name":"_appserver",
        "password":"*",
        "uid":79,
        "gid":79,
        "comment":"Application Server",
        "home":"/var/empty",
        "shell":"/usr/bin/false"
    },
    {
        "name": "_jabber",
        "password": "*",
        "uid": 84,
        "gid": 84,
        "comment": "Jabber XMPP Server",
        "home": "/var/empty",
        "shell": "/usr/bin/false"
    }
]
  

Groups only have gids (and not uids):

 [
    {
        "gid": 6,
        "name": "mail",
        "members": [
            "_teamsserver"
        ]
    }
    {
        "gid": 78,
        "name": "_mailman",
        "members": null
    },
    {
        "gid": 79,
        "name": "_appserverusr",
        "members": null
    },
    {
        "gid": 30,
        "name": "_keytabusers",
        "members": [
          "_calendar,_jabber,_postfix"
        ]
    }

]
  

Итак, когда, если я попытаюсь найти все группы, к которым принадлежит Jabber:

 http://localhost:8080/MyService/users/84/groups
  

Получаем следующую полезную нагрузку ответа JSON:

 [
    {
        "gid": 84,
        "name": "_jabber",
        "members": [
            "84",
            "Jabber XMPP Server",
            "/var/empty",
            "/usr/bin/false"
        ]
    }
]
  

Почему 84 находится внутри массива members JSON?

Предполагается, что это вернет все группы для данного пользователя:

 [   
    {
        "gid": 29,
        "name": "certusers",
        "members": [
          "root,_jabber,_postfix,_cyrus,_calendar,_dovecot"
        ]
    },
    {
        "gid": 30,
        "name": "_keytabusers",
        "members": [
          "_calendar,_jabber,_postfix"
        ]
    }
]   
  

Есть ли способ сопоставить (например, связать два списка массивов вместе или существует другая структура данных, которая помогла бы мне это сделать) User.uids с Group.gids?

Это все в памяти, поэтому, пожалуйста, не упоминайте использование ORM или JDBC.

Комментарии:

1. Откуда берутся эти две нужные группы? Как вы определяете, что jabber является частью этих двух групп (одна из которых даже не существует в списке групп, который вы опубликовали)?

2. Они поступают из списка массивов, который был заполнен мной при разборе файла /etc / group в Unix / Linux.

3. Каков ответ на мой второй вопрос? Вы получаете uid пользователя. Как вы находите группы, к которым принадлежит пользователь?

4. @JBNizet — У меня есть HTTP GET-вызов, который выдает мне всех пользователей, и внутри каждого отдельного пользователя есть gid и uid. Это gid, который я использую в своем коде (см. Выше). Я отредактировал сообщение, чтобы ответить на ваш вопрос…

5. ОК. Таким образом, это означает, что если вы передаете uid 84, то пользователь с именем «_jabber». Gid этого пользователя также равен 84. Таким образом, это означает, что у _jabber есть единственная группа, идентифицируемая gid 84 (которая отсутствует в опубликованном списке групп). Итак, полученный вами результат верен. Почему тогда вы ожидаете другого результата, содержащего группы 29 и 30?