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

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

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

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

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

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

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

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

@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;