package com.mossle.user.component; import java.util.Date; import java.util.List; import javax.annotation.Resource; import com.mossle.core.auth.LoginEvent; import com.mossle.user.persistence.domain.AccountLockInfo; import com.mossle.user.persistence.domain.AccountLockLog; import com.mossle.user.persistence.manager.AccountInfoManager; import com.mossle.user.persistence.manager.AccountLockInfoManager; import com.mossle.user.persistence.manager.AccountLockLogManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationListener; // @Component public class AccountLockListener implements ApplicationListener<LoginEvent> { private static Logger logger = LoggerFactory .getLogger(AccountLockListener.class); public static final int DEFAULT_THREHOLD = 5; private AccountInfoManager accountInfoManager; private AccountLockInfoManager accountLockInfoManager; private AccountLockLogManager accountLockLogManager; private int threhold = 5; public void onApplicationEvent(LoginEvent event) { if (!(event instanceof LoginEvent)) { return; } LoginEvent loginEvent = (LoginEvent) event; logger.debug("login : {}", loginEvent); try { String username = loginEvent.getUserId(); username = username.toLowerCase(); if ("success".equals(loginEvent.getResult())) { String logHql = "from AccountLockLog where type=? and username=?"; List<AccountLockLog> accountLockLogs = accountLockLogManager .find(logHql, loginEvent.getType(), username); accountLockLogManager.removeAll(accountLockLogs); String infoHql = "from AccountLockInfo where type=? and username=?"; List<AccountLockInfo> accountLockInfos = accountLockInfoManager .find(infoHql, loginEvent.getType(), username); accountLockInfoManager.removeAll(accountLockInfos); } else if ("badCredentials".equals(loginEvent.getResult())) { AccountLockLog accountLockLog = new AccountLockLog(); accountLockLog.setType(loginEvent.getType()); accountLockLog.setLockTime(new Date()); accountLockLog.setUsername(username); accountLockLogManager.save(accountLockLog); String logHql = "from AccountLockLog where type=? and username=?"; List<AccountLockLog> accountLockLogs = accountLockLogManager .find(logHql, loginEvent.getType(), username); if (accountLockLogs.size() > threhold) { AccountLockInfo accountLockInfo = new AccountLockInfo(); accountLockInfo.setType(loginEvent.getType()); accountLockInfo.setLockTime(new Date()); accountLockInfo.setUsername(username); accountLockInfoManager.save(accountLockInfo); } } else { logger.info("other loginEvent : {}", loginEvent.getResult()); } } catch (Exception ex) { logger.error(ex.getMessage(), ex); } } @Resource public void setAccountInfoManager(AccountInfoManager accountInfoManager) { this.accountInfoManager = accountInfoManager; } @Resource public void setAccountLockInfoManager( AccountLockInfoManager accountLockInfoManager) { this.accountLockInfoManager = accountLockInfoManager; } @Resource public void setAccountLockLogManager( AccountLockLogManager accountLockLogManager) { this.accountLockLogManager = accountLockLogManager; } public void setThrehold(int threhold) { this.threhold = threhold; } }