Как автоматически регистрировать запросы и информацию о пользователе, например, имя пользователя, в файл журнала, чтобы отслеживать активность пользователей в 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, который перехватывает события входа в систему.

Другие вопросы по тегам