Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* AcegiSecurityContextListener.java
  
  {{IS_NOTE
  	Purpose:
  		
  	Description:
  		
  	History:
  		Tue Sep  11 12:55:11     2006, Created by henrichen
 }}IS_NOTE
 
 Copyright (C) 2006 Potix Corporation. All Rights Reserved.
 
 {{IS_RIGHT
 	This program is distributed under GPL Version 3.0 in the hope that
 	it will be useful, but WITHOUT ANY WARRANTY.
 }}IS_RIGHT
 */
 package org.zkoss.zkplus.acegi;
 
 
 
 
 import  org.acegisecurity.context.SecurityContext;
 import  org.acegisecurity.context.SecurityContextHolder;
 import  org.acegisecurity.AcegiSecurityException;
 import  org.acegisecurity.AuthenticationException;
 
 import java.util.List;
 
 import  javax.servlet.Filter;
 import  javax.servlet.FilterChain;
 import  javax.servlet.ServletException;
 import  javax.servlet.ServletRequest;
 import  javax.servlet.ServletResponse;

Listener to copy servlet thread ThreadLocal, securityContext, over to event thread ThreadLocal and handle Acegi Authentication Exception occured in Event handling (e.g. Acegi's MethodInterceptor).

Whenever you use Acegi as your security provider you have to add following lines in WEB-INF/zk.xml:


  <listener>
  <description>Acegi SecurityContext Handler</description>
  <listener-class>org.zkoss.zkplus.acegi.AcegiSecurityContextListener</listener-class>
 </listener>
 

Author(s):
henrichen
 
 	private static final Log log = Log.lookup(AcegiSecurityContextListener.class);
 	private SecurityContext _context;
 	private final boolean _enabled//whether event thread enabled
 
 		final WebApp app = Executions.getCurrent().getDesktop().getWebApp();
 	}
 	
 	//-- EventThreadInit --//
 	public void prepare(Component compEvent evt) {
 		if () {
 			 = SecurityContextHolder.getContext(); //get threadLocal from servlet thread
 		}
 	}
 	
 	public boolean init(Component compEvent evt) {
 		if () {
 			SecurityContextHolder.setContext(); //store into event thread
 			 = null;
 		}
 		return true;
 	}
 	
 	//-- EventThreadCleanup --//
 	public void cleanup(Component compEvent evtList errs) {
 		if (!
 			return;
		 = SecurityContextHolder.getContext(); //get threadLocal from event thread
		//handle Acegi Exception occured within Event handling
		final Execution exec = Executions.getCurrent();
		if (errs != null && !errs.isEmpty() && errs.size() == 1) {
			Throwable ex = (Throwableerrs.get(0);
			if (ex != null) {
				ex = Exceptions.findCause(ex, AcegiSecurityException.class);
				if (ex instanceof AcegiSecurityException) {
					//ZK massage the exception to visual message (not an exception), so
					//we remember the exception in request attribute and let ZkEventExceptionFilter
					//to rethrow the exception so Acegi's ExcepitonTranslationFilter can
					//catch that and show login window.
					//to avoid show the massaged visula message
					errs.clear();
				}
			}
		}
		//there was other exception, no need to go thru acegi filter chain.
		if (errs != null && !errs.isEmpty()) return;
		//carry the current event that would be used by the filter chain.
		Filter filter = (Filter) SpringUtil.getBean("zkFilterChainProxy");
		if (filter != null) {
			ServletRequest request = (ServletRequest) exec.getNativeRequest();
			ServletResponse response = (ServletResponse) exec.getNativeResponse();
			ServletResponse resp = BufferedResponse.getInstance(responsenew NullWriter());
			try {
				filter.doFilter(requestrespnew NullFilterChain());
catch(Exception ex1) {
				throw UiException.Aide.wrap(ex1); //should never occur
			}
			//after filter chain, SecurityContext could have changed
			 = SecurityContextHolder.getContext(); //get threadLocal from event thread
		}
	}
	public void complete(Component compEvent evt) {
		if () {
			SecurityContextHolder.setContext(); //store into servlet thread
			 = null;
		}
	}
	//-- EventThreadResume --//
	public void beforeResume(Component compEvent evt) {
		if () {
			 = SecurityContextHolder.getContext(); //get threadLocal from servlet thread
		}
	}
	public void afterResume(Component compEvent evt) {
		if () {
			SecurityContextHolder.setContext(); //store into event thread
			 = null;
		}
	}
 	public void abortResume(Component compEvent evt) {
 		//do nothing
 	}
    private static class NullFilterChain implements FilterChain {
    	public void doFilter(ServletRequest request, ServletResponse response)
        throws java.io.IOException, ServletException {
        	//do nothing
        }
    }
New to GrepCode? Check out our FAQ X