Как автоматически регистрировать запросы и информацию о пользователе, например, имя пользователя, в файл журнала, чтобы отслеживать активность пользователей в liferay?
В Liferay 7 Enterprise Edition,
Я хочу регистрировать информацию о пользователе, такую как имя_пользователя, во внешних файлах журнала автоматически при каждом запросе для отслеживания действий пользователя. Как это сделать?
без использования плагина аудита
например, когда я пытался войти в пост-запрос (логин), он не содержал никакой информации о пользователе?!
3 ответа
Такого рода вещи гораздо сложнее, чем вы думаете...
Получить доступ к текущему пользователю очень просто. Как отметил Виктор, вы можете использовать объект ThemeDisplay для получения текущего пользователя. Если у вас нет запроса, вы можете использовать PrincipalThreadLocal, чтобы найти текущий идентификатор пользователя.
Это дает вам, кто, но, конечно, не аспекты "что делает пользователь". Поскольку портал объединяет фрагменты HTML многих портлетов, с точки зрения фильтра сервлетов было бы трудно определить, с каким из доступных портлетов во входящем URL действительно взаимодействует. Вы можете попробовать фильтр портлетов, чтобы сузить поле, но это просто скажет вам, к какому портлету обращаются, а не что они с ним делают.
Несмотря на то, что вы отказались от встроенной функции аудита, доступной в DXP, это действительно ответ для отслеживания того, кто что делал на портале, потому что у него есть необходимые точки соприкосновения, чтобы собрать эти две части и соединить их.
Теперь, если вы отказались от встроенной функции аудита, потому что вам нужен файл, а не запись в базе данных, это легко решить. Перейдите на панель управления "Системные настройки", найдите обработчик сообщений аудита ведения журнала и включите его. Он запишет события аудита в файл в формате CSV, но у вас должен быть источник для модулей /apps/foundation/portal-security-аудит /portal-security-audit-router/src/main/java/com/liferay/portal/security/audit/router/internal/LoggingAuditMessageProcessor.java, чтобы вы могли использовать это в качестве основы для написания своего собственного формата.
Это похоже на работу фильтра, пользовательская информация обычно извлекается из themeDysplay, например:
ThemeDisplay themeDisplay = ( ThemeDisplay ) request.getAttribute( THEME_DISPLAY );
long userId = themeDisplay.getRealUserId();
Если вы хотите отслеживать определенные портлеты, фильтр портлетов OSGi сделает эту работу.
Посмотрите на этот код: https://github.com/amusarra/liferay-portal-security-audit
в частности модуль portal-security-audit-capture-events, который перехватывает события входа в систему.