Итак, вы уже получаете доступ к объекту аутентификации непосредственно из SecurityContextHolder, вы можете сделать это в своем контроллере.
@RequestMapping(value ="/cities")
public List<RandomCity> getCitiesAndLogWhoIsRequesting(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication != null){
//log user name
logger.info(authentication.get());
}
return userService.findAllRandomCities();
}
Если вы не хотите помещать все это в каждую конечную точку, служебный метод может бытьсоздан для извлечения аутентификации и возврата его имени, если найдено.
public class UserUtil {
public static String userName(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authentication == null ? null : authentication.getName();
}
}
и вызова его в вашей конечной точке как
@RequestMapping(value ="/cities")
public List<RandomCity> getCitiesAndLogWhoIsRequesting(){
//log user name
logger.info(UserUtil.username());
return userService.findAllRandomCities();
}
Однако вы все еще добавляете строки кода в каждую конечную точку, ипосле нескольких из них начинает чувствовать себя неправильно, будучи вынужденным сделать это.Я предлагаю вам попробовать аспектно-ориентированное программирование для такого рода вещей.Это потребует от вас потратить некоторое время на изучение его работы, создание необходимых аннотаций или исполнений.Но вы должны иметь это через день или два.При ориентированном аспекте ваша конечная точка может заканчиваться следующим образом
@RequestMapping(value ="/cities")
@LogUserName
public List<RandomCity> getCitiesAndLogWhoIsRequesting(){
//LogUserName annotation will inform this request should log user name if found
return userService.findAllRandomCities();
}
Конечно, вы можете удалить пользовательскую аннотацию @LogUserName и настроить новый аспект так, чтобы он вызывался методами внутри пакета или классами, расширяющими @Controller,и т. д. Определенно стоит потратить время, потому что вы можете использовать аспекты не только для регистрации имени пользователя.