Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- изменение, о которой речь в задаче, было совершено в промежуток, когда было вызвано действие loginformaction и когда пользователь залогинился, поэтому там и не прописан пользователь (в логах [http://mirapolis.domadengi.ru/mira guest 10.1.1.161] ). Изменения именно по этому пользователю:
- в главной операции в записи в таблице ca$post с postid=13361 вносится пустое значение в поле personid вместо 1209, которое было измачально (это понятно по SQL отката)
- в дочерней в записи в таблице pp$career, в которой pwid равен pwid из записи в таблице pp$person с personid=1209, а capostid=13361, в поле pcdismissaldate устанавливается значение текущей на тот момент даты
- Ну то есть физ.лицо как бы снято с должности.
- Локально у меня не воспроизводится такая ситуация, поэтому чтоб попробовать понять, как и почему эти изменения были внесены, смотрю код и логи
- тут кусок логов, в котором все это происходит https://pastebin.com/ar2cuxxc
- на строке номер 2 такое: action=loginformaction: viewType=html&user=oivankova&password=(hidden)&doaction=loginformaction
- В LoginFormAction в createView строка BaseActionClientElement clientElement = super.processAction(Context.get(), loginDto);
- смотрю processAction из LoginAction, метод начинается с
- assert authenticationService != null && logicService != null && sysModule != null;
- try {
- UserData userData = loadUserData(loginDto);
- смотрю loadUserData, там строка return authenticationService.loadUserData(Context.get(), loginDto.getUser(), loginDto.getPassword());
- где authenticationService это
- @Autowired
- private AuthenticationService authenticationService;
- У них в системе используется профиль аутентификации ldap-auth, в нем <bean name="authentication" class="lms.system.access.DefaultDBLDAPAuthenticationService">
- в DefaultDBLDAPAuthenticationService метода loadUserData нет, он в родителе DBLDAPAuthenticationService, смотрю там
- первые 3 строки
- String processedLogin = ServiceFactory.getService(PasswordGenerator.class).prepareUserPasswordBeforeCheck(login);
- String processedPassword = ServiceFactory.getService(PasswordGenerator.class).prepareUserPasswordBeforeCheck(password);
- validateLoginAndPassword(processedLogin, processedPassword);
- ничего такого
- дальше, то, что в теле условия будет true, поэтому смотримметод ldapAuth, в нем судя по логам тут ldapAccount будет не null
- LDAPUser ldapAccount = getLdapService().getUser(login, password);
- дальше строка
- PersonBean user = updatePerson(context, ldapAccount, login);
- судя по логам она возвращает не null, а то, что идет дальше:
- if (user != null) {
- checkPerson(user, login, password);
- будет выполнено уже после того, как изменения, о которых речь в задаче, будут совершены и будет создана запись журнала событий
- то есть надо смотреть метод updatePerson
- в этом методе вызывается запрос, который начинается на строке 25 в логе, возвращает одну строку, то есть person будет не null
- никаких исключений не выбрасывалось, поэтому сразу смотрим
- if (person == null || isUpdateExistsUsers()) {
- person = saveUser(context, user, login, person);
- if (person != null && person.getId() != null && !"".equals(person.getId()))
- addUserGroup(context, person.getId(), user.getGroupsList());
- }
- тут isUpdateExistsUsers() true, addUserGroup ничего такого не делает, поэтому смотрю saveUser из DefaultDBLDAPAuthenticationService
- там FillPersonResult fillPersonResult = fillPerson(person, user, login);
- спускаюсь в fillPerson
- в нем есть два варианта, когда у person может быть изменено значение postRs (во внутреннем бине mainWork)
- первый - внутри метода
- if (CollectionUtils.isNotEmpty(ldapFields)) {
- return fillPersonByFieldsMatch(person, user, login);
- }
- второй - при выполнении метода из условия
- if (FillPersonResult.NEED_UPDATE.equals(fillPersonFromContext(context, person, user))) {
- result = FillPersonResult.NEED_UPDATE;
- }
- Думаю, так и было (то есть какой-то из этих двух вариантов, какой именно по логам непонятно), но по логам я не могу на 100% сказать, других вариантов у меня нет
- дальше возвращаюсь в saveUser из DefaultDBLDAPAuthenticationService
- там
- if (FillPersonResult.NEED_UPDATE.equals(fillPersonResult)) {
- EntityExtension entity = Store.getInstance().getEntityExtension(PersonFrame.NAME);
- String personId = entity.save(context, person.get(), false).getId();
- person.setId(personId);
- }
- а в PersonService внутри getPersonListener внутри setSaveListener есть такое
- //Обновляем пользователя в штатной должности
- personWorkService.updatePostByPerson(data.getId(), data.getMainWork(), oldBean != null ? oldBean.getMainWork() : null);
- //Обновляем карьеру
- boolean personStatusChangedFromArchived = !getSaveInfo().isInsert() && oldBean.isArchive() && !data.isArchive();
- //при переносе из архива не происходит карьерных изменений
- if (!personStatusChangedFromArchived){
- careerService.updateCareer(data.getMainWork(), oldBean != null ? oldBean.getMainWork() : new PersonWorkBean());
- }
- 1. В записи журнала указана информация об обновлении штатной должности, но в поле "Тип объекта" указано "Физическое лицо".
- Вопрос, нужно ли как-то делать так, чтоб в поле Пользователь у записи лога был пользователь, который логинится (ну или мб администратор), или именно в этом случае нормально что там пусто?
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement