Improve system authenticated bean post-processing
[lgpl/argeo-commons.git] / security / runtime / org.argeo.security.core / src / main / java / org / argeo / security / core / SystemExecutionBeanPostProcessor.java
index 017317361f9c70ce067172238872bf1534581365..a2086bb9cda28918152c01fe6b31db07d8a0ba9b 100644 (file)
@@ -1,14 +1,38 @@
 package org.argeo.security.core;
 
+import java.beans.PropertyDescriptor;
+
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.beans.PropertyValues;
+import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
 
 /**
- * Executes with a system authentication the initialization methods of the
- * application context where it has been defined.
+ * Executes with a system authentication the instantiation and initialization
+ * methods of the application context where it has been defined.
  */
-public class SystemExecutionBeanPostProcessor extends
-               AbstractSystemExecution implements BeanPostProcessor {
+public class SystemExecutionBeanPostProcessor extends AbstractSystemExecution
+               implements InstantiationAwareBeanPostProcessor, ApplicationListener {
+
+       @SuppressWarnings("rawtypes")
+       public Object postProcessBeforeInstantiation(Class beanClass,
+                       String beanName) throws BeansException {
+               authenticateAsSystem();
+               return null;
+       }
+
+       public boolean postProcessAfterInstantiation(Object bean, String beanName)
+                       throws BeansException {
+               return true;
+       }
+
+       public PropertyValues postProcessPropertyValues(PropertyValues pvs,
+                       PropertyDescriptor[] pds, Object bean, String beanName)
+                       throws BeansException {
+               return pvs;
+       }
 
        public Object postProcessBeforeInitialization(Object bean, String beanName)
                        throws BeansException {
@@ -26,4 +50,12 @@ public class SystemExecutionBeanPostProcessor extends
                return bean;
        }
 
+       public void onApplicationEvent(ApplicationEvent event) {
+               if (event instanceof ContextRefreshedEvent) {
+                       // make sure that we have deauthenticated after the application
+                       // context was initialized/refreshed
+                       deauthenticateAsSystem();
+               }
+       }
+
 }