package de.forsthaus.policy; import java.io.Serializable; import org.aspectj.lang.ProceedingJoinPoint; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.WebAuthenticationDetails; import de.forsthaus.gui.service.GuiLoginLoggingPolicService; /** * This class is called from spring aop as an aspect and is for logging <br> * the Login of a user. It is configurated in the <br> * '/zkoss/src/main/resources/springSecurityContext.xml' <br> * Logs success and fails, sessionID, timestamp and remoteIP. <br> * * @author bbruhns * */ public class LoginLoggingPolicyService implements Serializable { private static final long serialVersionUID = 1L; private GuiLoginLoggingPolicService guiLoginLoggingPolicService; public LoginLoggingPolicyService() { } private void logAuthPass(Authentication authentication) { final String user = authentication.getName(); final long userId = ((User) authentication.getPrincipal()).getUserId(); final String clientAddress = convertClientAddress(authentication); final String sessionId = convertClientSessionId(authentication); getGuiLoginLoggingPolicService().logAuthPass(user, userId, clientAddress, sessionId); } private void logAuthFail(Authentication authentication) { final String user = authentication.getName(); final String clientAddress = convertClientAddress(authentication); final String sessionId = convertClientSessionId(authentication); getGuiLoginLoggingPolicService().logAuthFail(user, clientAddress, sessionId); } public Authentication loginLogging(ProceedingJoinPoint call) throws Throwable { final Authentication authentication = (Authentication) call.getArgs()[0]; final Authentication result; try { result = (Authentication) call.proceed(); } catch (Exception e) { logAuthFail(authentication); throw e; } if (result != null) { logAuthPass(result); } return result; } private String convertClientAddress(Authentication authentication) { try { WebAuthenticationDetails details = (WebAuthenticationDetails) authentication.getDetails(); return details.getRemoteAddress(); } catch (ClassCastException e) { // securitycontext ist vom falschen Typ! return "<unbekannt>"; } } private String convertClientSessionId(Authentication authentication) { try { WebAuthenticationDetails details = (WebAuthenticationDetails) authentication.getDetails(); return details.getSessionId(); } catch (ClassCastException e) { // securitycontext ist vom falschen Typ! return "<unbekannt>"; } } public GuiLoginLoggingPolicService getGuiLoginLoggingPolicService() { return guiLoginLoggingPolicService; } public void setGuiLoginLoggingPolicService(GuiLoginLoggingPolicService guiLoginLoggingPolicService) { this.guiLoginLoggingPolicService = guiLoginLoggingPolicService; } }