Advertisement
Guest User

Untitled

a guest
Apr 17th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.06 KB | None | 0 0
  1. изменение, о которой речь в задаче, было совершено в промежуток, когда было вызвано действие loginformaction и когда пользователь залогинился, поэтому там и не прописан пользователь (в логах [http://mirapolis.domadengi.ru/mira guest 10.1.1.161] ). Изменения именно по этому пользователю:
  2.  
  3. в главной операции в записи в таблице ca$post с postid=13361 вносится пустое значение в поле personid вместо 1209, которое было измачально (это понятно по SQL отката)
  4. в дочерней в записи в таблице pp$career, в которой pwid равен pwid из записи в таблице pp$person с personid=1209, а capostid=13361, в поле pcdismissaldate устанавливается значение текущей на тот момент даты
  5.  
  6. Ну то есть физ.лицо как бы снято с должности.
  7.  
  8.  
  9. Локально у меня не воспроизводится такая ситуация, поэтому чтоб попробовать понять, как и почему эти изменения были внесены, смотрю код и логи
  10.  
  11. тут кусок логов, в котором все это происходит https://pastebin.com/ar2cuxxc
  12.  
  13. на строке номер 2 такое: action=loginformaction: viewType=html&user=oivankova&password=(hidden)&doaction=loginformaction
  14.  
  15. В LoginFormAction в createView строка BaseActionClientElement clientElement = super.processAction(Context.get(), loginDto);
  16.  
  17. смотрю processAction из LoginAction, метод начинается с
  18. assert authenticationService != null && logicService != null && sysModule != null;
  19. try {
  20. UserData userData = loadUserData(loginDto);
  21.  
  22. смотрю loadUserData, там строка return authenticationService.loadUserData(Context.get(), loginDto.getUser(), loginDto.getPassword());
  23. где authenticationService это
  24. @Autowired
  25. private AuthenticationService authenticationService;
  26.  
  27. У них в системе используется профиль аутентификации ldap-auth, в нем <bean name="authentication" class="lms.system.access.DefaultDBLDAPAuthenticationService">
  28.  
  29. в DefaultDBLDAPAuthenticationService метода loadUserData нет, он в родителе DBLDAPAuthenticationService, смотрю там
  30.  
  31. первые 3 строки
  32. String processedLogin = ServiceFactory.getService(PasswordGenerator.class).prepareUserPasswordBeforeCheck(login);
  33. String processedPassword = ServiceFactory.getService(PasswordGenerator.class).prepareUserPasswordBeforeCheck(password);
  34. validateLoginAndPassword(processedLogin, processedPassword);
  35. ничего такого
  36.  
  37. дальше, то, что в теле условия будет true, поэтому смотримметод ldapAuth, в нем судя по логам тут ldapAccount будет не null
  38. LDAPUser ldapAccount = getLdapService().getUser(login, password);
  39. дальше строка
  40. PersonBean user = updatePerson(context, ldapAccount, login);
  41. судя по логам она возвращает не null, а то, что идет дальше:
  42. if (user != null) {
  43. checkPerson(user, login, password);
  44. будет выполнено уже после того, как изменения, о которых речь в задаче, будут совершены и будет создана запись журнала событий
  45. то есть надо смотреть метод updatePerson
  46.  
  47. в этом методе вызывается запрос, который начинается на строке 25 в логе, возвращает одну строку, то есть person будет не null
  48.  
  49. никаких исключений не выбрасывалось, поэтому сразу смотрим
  50. if (person == null || isUpdateExistsUsers()) {
  51. person = saveUser(context, user, login, person);
  52. if (person != null && person.getId() != null && !"".equals(person.getId()))
  53. addUserGroup(context, person.getId(), user.getGroupsList());
  54. }
  55.  
  56. тут isUpdateExistsUsers() true, addUserGroup ничего такого не делает, поэтому смотрю saveUser из DefaultDBLDAPAuthenticationService
  57.  
  58. там FillPersonResult fillPersonResult = fillPerson(person, user, login);
  59.  
  60. спускаюсь в fillPerson
  61.  
  62. в нем есть два варианта, когда у person может быть изменено значение postRs (во внутреннем бине mainWork)
  63. первый - внутри метода
  64. if (CollectionUtils.isNotEmpty(ldapFields)) {
  65. return fillPersonByFieldsMatch(person, user, login);
  66. }
  67. второй - при выполнении метода из условия
  68. if (FillPersonResult.NEED_UPDATE.equals(fillPersonFromContext(context, person, user))) {
  69. result = FillPersonResult.NEED_UPDATE;
  70. }
  71.  
  72. Думаю, так и было (то есть какой-то из этих двух вариантов, какой именно по логам непонятно), но по логам я не могу на 100% сказать, других вариантов у меня нет
  73.  
  74. дальше возвращаюсь в saveUser из DefaultDBLDAPAuthenticationService
  75. там
  76. if (FillPersonResult.NEED_UPDATE.equals(fillPersonResult)) {
  77. EntityExtension entity = Store.getInstance().getEntityExtension(PersonFrame.NAME);
  78. String personId = entity.save(context, person.get(), false).getId();
  79. person.setId(personId);
  80. }
  81.  
  82. а в PersonService внутри getPersonListener внутри setSaveListener есть такое
  83. //Обновляем пользователя в штатной должности
  84. personWorkService.updatePostByPerson(data.getId(), data.getMainWork(), oldBean != null ? oldBean.getMainWork() : null);
  85. //Обновляем карьеру
  86. boolean personStatusChangedFromArchived = !getSaveInfo().isInsert() && oldBean.isArchive() && !data.isArchive();
  87. //при переносе из архива не происходит карьерных изменений
  88. if (!personStatusChangedFromArchived){
  89. careerService.updateCareer(data.getMainWork(), oldBean != null ? oldBean.getMainWork() : new PersonWorkBean());
  90. }
  91.  
  92. 1. В записи журнала указана информация об обновлении штатной должности, но в поле "Тип объекта" указано "Физическое лицо".
  93. Вопрос, нужно ли как-то делать так, чтоб в поле Пользователь у записи лога был пользователь, который логинится (ну или мб администратор), или именно в этом случае нормально что там пусто?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement