如何在Spring Boot应用程序中使用Spring Security监听登录/注销事件?

时间:2016-03-16 12:18:48

标签: java spring events spring-security spring-boot

我正在尝试在Spring Security中成功/失败登录/注销后记录消息。

另外,我使用的是Spring Boot,因此配置代码很少。

我正在使用的表单是自动生成的。

$(button).on('click', function(event) { event.preventDefault(); var grid = $('.grid-class'); $('body, html').animate({ scrollTop: grid.offset().top }, 400); });

WebSecurityConfig.java

@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/resources/**").permitAll() .anyRequest().fullyAuthenticated() .and() .formLogin(); } @Configuration protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter { @Override public void init(AuthenticationManagerBuilder auth) throws Exception { auth .ldapAuthentication() .userSearchFilter("(uid={0})") .contextSource() .url("ldap://...:389/ou=...,dc=...,dc=...") .managerDn("cn=...,dc=...,dc=...") .managerPassword("..."); } } }

logback.xml

我的登录成功代码如下:

<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> </configuration>

LoginSuccessService.java

它不会起作用。我在日志中什么都没得到。

我需要编写哪些附加代码,如果有的话?我需要在任何地方初始化此侦听器吗?

我也使用this link作为参考,但我认为我不需要写一个发布者,因为我没有为该活动编写自己的类。

我也尝试使用import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationListener; import org.springframework.security.authentication.event.*; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; @Component public class LoginSuccessService implements ApplicationListener<InteractiveAuthenticationSuccessEvent>{ private static final Logger logger = LoggerFactory.getLogger(LoginSuccessService.class); @Override public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) { logger.debug("You have been logged in successfully."); Date loginDate = new Date(); logger.debug("Login Time: " + loginDate.toString()); } } 代替AuthenticationSuccessEvent,但同样的事情。

如果有帮助,登录失败会产生以下输出(预期输出应包括&#34;无法登录&#34;以及当前日期,这是InteractiveAuthenticationSuccessEvent中debug = TRUE的日志) :

application.properties

1 个答案:

答案 0 :(得分:1)

错误结果与配置有关。

为了捕获登录事件,我使用了对象

InteractiveAuthenticationSuccessEventAuthenticationSuccessEvent(注销还没有实现的监听器,你可能会对HttpSessionEvent感到满意)。

此外,查看记录器是否配置为记录您的包也很重要;默认情况下,应用程序未配置为记录应用程序消息。这就是为什么我没有得到任何输出。

所以,有两件事:

  • 如果您的软件包名称为com.mycompany,则应在application.propertiesapplication.yml文件中添加一行(通常位于<PROJ_DIR>/src/main/resources/;若否,请创建您自己的名称)用于记录:

application.properties

logging.level.com.mycompany=DEBUG/INFO/WARN/ERROR 
    #debug is lowest, error is highest

或:

application.yml

logging:
    level:
        com:
            mycompany: DEBUG/INFO/WARN/ERROR
  • 如果您尝试记录外部程序包,请使用debug()方法记录它,否则它可能不会显示(我使用info()而我什么都没有。)