【发布时间】:2015-12-19 01:28:29
【问题描述】:
我已经实现了 spring security oauth2 来保护不同的服务。
现在我需要记录客户端 ip、客户端 ID、请求服务、请求 URL 和事件类型,例如“身份验证失败”、“授权失败”等。
我想出了以下方法
public class Events implements ApplicationListener<ApplicationEvent>{
private static Logger log = LoggerFactory.getLogger(Events.class);
@Override
public void onApplicationEvent(ApplicationEvent appEvent) {
if (appEvent instanceof AuthenticationSuccessEvent) {
AuthenticationSuccessEvent event = (AuthenticationSuccessEvent) appEvent;
long timestamp = event.getTimestamp();
User user = (User) event.getAuthentication().getPrincipal();
System.out.println("client " + user.getUsername() + " has been authenticated successfully.");
UsernamePasswordAuthenticationToken source = (UsernamePasswordAuthenticationToken) event.getSource();
WebAuthenticationDetails details = (WebAuthenticationDetails) source.getDetails();
System.out.println("remote ip is " + details.getRemoteAddress());
}
if (appEvent instanceof AuthorizationFailureEvent) {
//TODO
((AuthorizationFailureEvent) appEvent).getAccessDeniedException();
}
if (appEvent instanceof AbstractAuthenticationFailureEvent) {
System.out.println("Sorry, authenticated for client " + appEvent.getSource().toString() + " failure.");
}
}
}
因为请求是异步的,所以我不知道如何从上下文中获取请求。如果我能得到 HttpServletRequest 请求,我几乎可以得到所有东西。
【问题讨论】:
-
该事件有
Authentication,它又包含详细信息,对于网络来说是WebAuthenticationDetails。这种机制是可插入的,您可以为详细信息创建自己的填充器,以包含您需要包含的内容。 -
嗨 Deinum,它只包含我想要的 getRemoteAddress 方法。并非所有必填字段。
-
如前所述,您可以创建自己的详细信息并将其注入以包含您想要的所有属性。创建一个实现
AuthenticationDetailsSource的类并实现buildDetails方法。 -
谢谢。我遇到了新问题,它会在身份验证成功或失败时触发事件。但是该事件在被授权时不会触发。你知道怎么解决吗?
标签: spring security spring-security-oauth2 access-log