如何在春季记录请求和不同事件的安全活动?

Posted

技术标签:

【中文标题】如何在春季记录请求和不同事件的安全活动?【英文标题】:How do I log security activities for request and different event in spring? 【发布时间】: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方法。 谢谢。我遇到了新问题,它会在身份验证成功或失败时触发事件。但是该事件在被授权时不会触发。你知道怎么解决吗? 【参考方案1】:

请参阅this。我在 web.xml 中添加了 RequestContextFilter。

<filter>

  <filter-name>requestContextFilter</filter-name>

  <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>

    <init-param>

      <param-name>threadContextInheritable</param-name>

      <param-value>true</param-value>

   </init-param>

</filter>

<filter-mapping>

  <filter-name>requestContextFilter</filter-name>

  <url-pattern>/*</url-pattern>

</filter-mapping>

效果很好。

【讨论】:

以上是关于如何在春季记录请求和不同事件的安全活动?的主要内容,如果未能解决你的问题,请参考以下文章

传递 POST 请求。春季安全。休息模板。杰克逊转换器

MockMVC - 如何使用 org.hamcrest.Matcher 在春季安全集成测试中检查 JWT 令牌的内容

春季/安全中的自定义会话超时

如何在春季安全中IP白名单/oauth/check_token端点

春季安全删除用户 - 会话仍处于活动状态

如何在身份验证之后和注销之前调用方法? (春季安全)