【发布时间】:2016-01-04 14:36:33
【问题描述】:
我有一个 Spring 项目,我在登录成功时实现了一个审计功能。该功能有效,但我需要在登录成功时写入数据库。我的豆子是:
CustomLoginSucessHandler.java
public class CustomLoginSucessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
final static Logger log = LoggerFactory.getLogger(CustomLoginSucessHandler.class);
@Autowired
private UserService userService;
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
final String userName = authentication.getName();
log.debug("User name is: " + userName);
final User user = userService.getUser(userName);
final Date date = new Date();
final Timestamp timeStamp = new Timestamp(date.getTime());
user.setLastLogin(timeStamp);
userService.saveUser(user);
log.debug("User Last Login update to " + timeStamp);
super.onAuthenticationSuccess(request, response, authentication);
}
}
请注意,我有 @Autowired 注释,但它始终返回为 null。
我已经尝试用@Service和@Configurable注释,目前没有成功。
堆栈跟踪
java.lang.NullPointerException
com.opessoftware.fatca.web.util.CustomLoginSucessHandler.onAuthenticationSuccess(CustomLoginSucessHandler.java:33)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.successfulAuthentication(AbstractAuthenticationProcessingFilter.java:331)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:245)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:96)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
编辑:
我如何使用我的CustomLoginSucessHandler
@Configuration
@EnableWebSecurity
@Import({ DatabaseConfiguration.class })
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage("/login.html")
.loginProcessingUrl("/login").permitAll().and().logout().logoutSuccessUrl("/")
.logoutRequestMatcher(new AntPathRequestMatcher("/logout")).permitAll().and().exceptionHandling()
.accessDeniedPage("/403.html");
http.csrf().requireCsrfProtectionMatcher(new CsrfRequestMatcher());
http.formLogin().successHandler(new CustomLoginSucessHandler());
}
....
【问题讨论】:
-
CustomLoginSucessHandler不受 Spring 管理,因此@Autowired将不起作用。展示您如何创建和使用CustomLoginSucessHandler的实例 -
你的 spring 配置文件中是否正确定义了
UserServicebean? -
@LuiggiMendoza 我编辑了问题
-
@mixmastered 是的,我可以在其他 bean 中使用 UserService。
-
你需要有context.xml,这里需要添加
<context:annotation-config />然后@Autowired和@PostConstruct会被搜索到
标签: java spring spring-mvc nullpointerexception autowired