
clime.messadmin.providers.user.AcegiUserName Maven / Gradle / Ivy
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