Механизм логина от имени пользователя

Общие принципы

Функционал, позволяющий пользователям системы авторизоваться от имени другого выбранного пользователя. Это может понадобиться в ряде случаев. Например:

  • При передаче в управление учётной записи

  • Необходимости службе поддержки взять управление для удалённой помощи пользователю

  • Необходимости входа администратора

При работе под учётной записью пользователя логируется (пишется в журнал безопасности) кто совершает действия.

Методы работы механизма логина от имени пользователя

@Override
public UserInfoDTO getUserInfo(@RequestHeader("Authorization") String sessionId, HttpServletResponse response) {
    final UserInfo userInfo = mellophone.user(new SystemCallContext(), sessionId);
    return userService.getUserInfo(userInfo);
}

@Override
public String setOnBehalfInfo(@RequestBody UserDTO request, @RequestHeader("Authorization") String sessionId,
                             HttpServletResponse response) {
    mellophone.setOnBehalfInfo(sessionId, request);
    return "OK";
}

@Override
public String backToAdminSession(@RequestBody UserInfoDTO request, @RequestHeader("Authorization") String sessionId,
                              HttpServletResponse response) {
    mellophone.backToAdminSession(sessionId, request);
    return "OK";
}

Реализация механизма установки прав пользователя в зависимости от способа логина

            UserInfo userInfo = this.restTemplate.getForObject(url, UserInfo.class);
            String userInfoSid = userInfo.getSid();

            if (onBehalfUser != null) {
                userInfo.setSid(onBehalfUser.getSid());
                userInfo.setLogin(onBehalfUser.getLogin());
                userInfo.setOriginatorSid(userInfoSid);
                userInfo.setName(onBehalfUser.getFullName());
                if (onBehalfUser.isAdmin()) {
                    userInfo.setAdmin(onBehalfUser.isAdmin());
                }
                if (onBehalfUser.isTestAdmin()) {
                    userInfo.setTestAdmin(onBehalfUser.isTestAdmin());
                }
                userInfo.setOnBehalf(true);
            }
            else {
                userCursor.tryGet(userInfoSid);
                userInfo.setOriginatorSid(userInfoSid);
                userInfo.setName(userCursor.getFullName());
                if (userCursor.getIsAdmin()) {
                    userInfo.setAdmin(userCursor.getIsAdmin());
                }
                if (userCursor.getIsTestAdmin()) {
                    userInfo.setTestAdmin(userCursor.getIsTestAdmin());
                }
                userInfo.setOnBehalf(false);
            }

            return userInfo;