Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* AcegiSecurityContextListener.java
  
  	Purpose:
  		
  	Description:
  		
  	History:
  		Tue Sep  11 12:55:11     2006, Created by henrichen
  
 Copyright (C) 2006 Potix Corporation. All Rights Reserved.
 
 {{IS_RIGHT
 	This program is distributed under LGPL Version 2.1 in the hope that
 	it will be useful, but WITHOUT ANY WARRANTY.
 }}IS_RIGHT
 */
 package org.zkoss.zkplus.acegi;
 
 import java.util.List;
 
 
 

Listener to copy servlet thread ThreadLocal, securityContext, over to event thread ThreadLocal and handle Acegi Authentication Exception occurred 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>
 

Applicable to Acegi Security version 1.0.3

Deprecated:
As of release 7.0.0
Author(s):
henrichen
 
 	private static final Logger log = LoggerFactory.getLogger(AcegiSecurityContextListener.class);
 	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 occurred 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(exAcegiSecurityException.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 visual 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) {
			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 requestServletResponse response)
        throws java.io.IOExceptionServletException {
        	//do nothing
        }
    }
New to GrepCode? Check out our FAQ X