Я запускаю образец веб-приложения Spring Security (hello world) в Apache Tomcat 8. Я пытаюсь увидеть информацию о пользователе в журналах доступа Tomcat, но похоже, что этой информации там нет. Пример записей журнала доступа:

0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:57 +0200] "GET / HTTP/1.1" 200 422
0:0:0:0:0:0:0:1 - - [06/Nov/2019:09:41:59 +0200] "GET /hello HTTP/1.1" 200 83

Конфигурация журнала доступа в Tomcat server.xml:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="common" />

pattern="common" соответствует Общему формату журнала, определенному в '%h %l %u %t "%r" %s %b', как описано здесь. В документации Tomcat также говорится:

%u — удаленный пользователь, прошедший аутентификацию (если есть), иначе '-'

Есть ли какая-либо дополнительная конфигурация, которую я должен применить, чтобы сделать пользователя видимым в журналах доступа?

4
Stiliyan Vasilev 6 Ноя 2019 в 10:52

1 ответ

Как ответил , он может работать не так, как ожидалось.

Клапан журнала доступа Tomcat, это не сработает, поскольку Tomcat не знает о Spring Security, который полностью работает в вашем приложении.

Вы можете использовать фильтр:

Самый простой вариант - просто добавить свой собственный фильтр (например, в web.xml) после Spring Security и вывести нужную информацию.

Другое решение предложено в Config9 вам может потребоваться включить имя пользователя в качестве атрибута сеанса

Возможно, этого недостаточно, так как общий шаблон уже содержит параметр %u. В этом случае я бы рекомендовал два дополнительных шага:

1) Поместите имя пользователя в параметр сеанса запроса, например:

request.getSession().addAttribute("username", user.getName());

2) Добавьте следующий параметр в шаблон журнала доступа: %{username}s

server.tomcat.accesslog.pattern=%h %l %t %u %{username}s "%r" %s %b
4
user7294900 6 Ноя 2019 в 11:04
У вас есть пример того, как этот фильтр должен выглядеть для отображения пользователю?
 – 
Stiliyan Vasilev
6 Ноя 2019 в 11:27
 – 
user7294900
6 Ноя 2019 в 11:33
Я внедрил собственный фильтр и попытался распечатать его в журналах доступа через %{username}s, и он работает правильно. Я также пытаюсь распечатать журналы с помощью LogbackValve через %reqAttribute{username}, но он возвращает «-». Знаете ли вы, как я могу получить имя пользователя в сценарии LogbackValve?
 – 
Stiliyan Vasilev
6 Ноя 2019 в 16:47
В настоящее время я не знаю
 – 
user7294900
6 Ноя 2019 в 16:53
Я думаю, вы можете задать новый конкретный вопрос о ведении журнала с использованием LogbackValve с атрибутом сеанса.
 – 
user7294900
7 Ноя 2019 в 14:04