All Downloads are FREE. Search and download functionalities are using the official Maven repository.

clime.messadmin.providers.user.AcegiUserName Maven / Gradle / Ivy

Go to download

Notification system and Session administration for J2EE Web Applications

The newest version!
/**
 */
package clime.messadmin.providers.user;

import java.lang.reflect.Method;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import clime.messadmin.model.ISessionInfo;
import clime.messadmin.model.Server;
import clime.messadmin.model.Session;
import clime.messadmin.model.SessionInfo;
import clime.messadmin.providers.spi.RequestLifeCycleProvider;

/**
 * Fetch the current user name from Acegi, if available.
 * 
 * Implementation note: Acegi stores its data in a ThreadLocal object, so we need to sniff it at request time.
 * Copy (cache) the information as RemoteUser at request time. It will be picked by the HttpRequestRemoteUser plugin.
 * 
 * @author Cédrik LIME
 * @since 4.1
 */
public class AcegiUserName implements RequestLifeCycleProvider {
	private Class securityContextHolderClass;
	private Method securityContextHolder_getContext;
	private Class securityContextClass;
	private Method securityContext_getAuthentication;
	private Class authenticationClass;
	private Method authentication_getPrincipal;
	private Class userDetailsClass;
	private Method userDetails_getUsername;
	private boolean acegiAvailable = false;

	/**
	 */
	public AcegiUserName() {
		super();
		try {
			securityContextHolderClass = Class.forName("org.acegisecurity.context.SecurityContextHolder");//$NON-NLS-1$
			securityContextClass = Class.forName("org.acegisecurity.context.SecurityContext");//$NON-NLS-1$
			authenticationClass = Class.forName("org.acegisecurity.Authentication");//$NON-NLS-1$
			userDetailsClass = Class.forName("org.acegisecurity.userdetails.UserDetails");//$NON-NLS-1$

			securityContextHolder_getContext = securityContextHolderClass.getMethod("getContext", null);//$NON-NLS-1$
			securityContext_getAuthentication = securityContextClass.getMethod("getAuthentication", null);//$NON-NLS-1$
			authentication_getPrincipal = authenticationClass.getMethod("getPrincipal", null);//$NON-NLS-1$
			userDetails_getUsername = userDetailsClass.getMethod("getUsername", null);//$NON-NLS-1$

			acegiAvailable = securityContextHolderClass != null && securityContextClass != null
				&& authenticationClass != null && userDetailsClass != null
				&& securityContextHolder_getContext != null
				&& securityContext_getAuthentication != null
				&& authentication_getPrincipal != null
				&& userDetails_getUsername != null;
		} catch (Exception e) {
			// do nothing, Acegi not available
			acegiAvailable = false;
		}
	}

	/**
	 * @see clime.messadmin.providers.spi.BaseProvider#getPriority()
	 */
	public int getPriority() {
		return 50;
	}

	/**
	 * {@inheritDoc}
	 */
	public void requestInitialized(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext) {
		/*
		Object obj = org.acegisecurity.context.SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		if (obj instanceof org.acegisecurity.userdetails.UserDetails) {
			String username = ((org.acegisecurity.userdetails.UserDetails) obj).getUsername();
		} else {
			String username = obj.toString();
		}
		 */
		if (acegiAvailable) {
			Session session = Server.getInstance().getSession(request.getSession(false));
			if (session != null) {
				ISessionInfo sessionInfo = session.getSessionInfo();
				if (sessionInfo != null && sessionInfo.getRemoteUser() == null) {
					try {
						String userName = null;
						Object securityContext = securityContextHolder_getContext.invoke(null, null);
						Object authentication = securityContext_getAuthentication.invoke(securityContext, null);
						Object obj = authentication_getPrincipal.invoke(authentication, null);
						if (userDetailsClass.isInstance(obj)) { // obj instanceof UserDetails
							userName = (String) userDetails_getUsername.invoke(obj, null);
						} else {
							userName = (obj == null) ? null : obj.toString();
						}
						if (userName != null) {
							((SessionInfo) sessionInfo).setRemoteUser(userName);
						}
					} catch (Exception e) {
						// shouldn't happen; nothing we can do anyway...
					}
				}
			}
		}
	}

	/**
	 * {@inheritDoc}
	 */
	public void requestDestroyed(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext) {
		// do nothing
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy