Index: topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java diff -u topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java:1.9 topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java:1.10 --- topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java:1.9 Mon Aug 28 14:37:18 2006 +++ topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java Mon Sep 18 15:53:13 2006 @@ -23,10 +23,10 @@ * Created: 3 janv. 2006 21:27:24 * * @author poussin - * @version $Revision: 1.9 $ + * @version $Revision: 1.10 $ * - * Last update: $Date: 2006/08/28 14:37:18 $ - * by : $Author: bpoussin $ + * Last update: $Date: 2006/09/18 15:53:13 $ + * by : $Author: ruchaud $ */ package org.codelutin.topia.framework; @@ -39,8 +39,6 @@ import org.codelutin.topia.TopiaNotFoundException; import org.codelutin.topia.persistence.TopiaDAO; import org.codelutin.topia.persistence.TopiaEntity; -import org.codelutin.topia.security.entities.TopiaPermissionManager; -import org.codelutin.topia.security.entities.TopiaUserManager; import org.codelutin.util.CategorisedListenerSet; import org.codelutin.util.ListenerSet; import org.hibernate.Session; @@ -203,11 +201,6 @@ */ public boolean isSecurityEnabled(); - /** - * Renvoie le type de sécurité utilisé par le contexte - */ - public String getSecurityType(); - public void removeChildContext(TopiaContextImplementor child); } //TopiaContextImplementor Index: topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java diff -u topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java:1.31 topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java:1.32 --- topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java:1.31 Thu Sep 14 17:43:11 2006 +++ topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java Mon Sep 18 15:53:13 2006 @@ -23,9 +23,9 @@ * * @author poussin * - * @version $Revision: 1.31 $ + * @version $Revision: 1.32 $ * - * Last update: $Date: 2006/09/14 17:43:11 $ by : $Author: bpoussin $ + * Last update: $Date: 2006/09/18 15:53:13 $ by : $Author: ruchaud $ */ package org.codelutin.topia.framework; @@ -43,6 +43,7 @@ import java.io.PrintStream; import java.io.Reader; import java.io.Writer; +import java.lang.reflect.Constructor; import java.sql.Connection; import java.sql.Statement; import java.text.DateFormat; @@ -81,13 +82,7 @@ import org.codelutin.topia.persistence.TopiaEntity; import org.codelutin.topia.persistence.TopiaEntityAbstract; import org.codelutin.topia.persistence.TopiaId; -import org.codelutin.topia.security.TopiaConfiguration; -import org.codelutin.topia.security.TopiaPolicy; -import org.codelutin.topia.security.TopiaSecurityVetoableListener; -import org.codelutin.topia.security.entities.TopiaPermissionManager; -import org.codelutin.topia.security.entities.TopiaUserManager; -import org.codelutin.topia.security.entities.hibernate.TopiaHibernatePermissionManager; -import org.codelutin.topia.security.entities.hibernate.TopiaHibernateUserManager; +import org.codelutin.topia.security.TopiaSecurityManager; import org.codelutin.util.ArrayUtil; import org.codelutin.util.CategorisedListenerSet; import org.codelutin.util.ListenerSet; @@ -155,6 +150,8 @@ static final private String TOPIA_PERSISTENCE_PROPERTIES_FILE = "topia.persistence.properties.file"; + static final private String TOPIA_SECURITY_MANAGER = "topia.security.manager"; + /** * Le pere de ce context, les contexts initaux n'ont pas de context pere */ @@ -210,15 +207,10 @@ protected List transactionEvents = new LinkedList(); /** - * Type de la sécurité (topia, ldap, ...) + * Manager pour la sécurité */ - protected String securityType = null; - - protected TopiaUserManager userManager; - protected TopiaPermissionManager permissionManager; - - protected TopiaSecurityVetoableListener securityListener; - + protected TopiaSecurityManager securityManager; + /** * constructeur utilisé par la factory pour creer les contexts initiaux * @@ -226,14 +218,7 @@ */ public TopiaContextImpl(Properties config) { this.config = config; - if (isSecurityEnabled()) { - securityListener = new TopiaSecurityVetoableListener(); - addVetoableListener(securityListener); - addVetoableLoadListener(securityListener); - TopiaPolicy policy = new TopiaPolicy(this); - policy.installPolicy(); - javax.security.auth.login.Configuration.setConfiguration(new TopiaConfiguration("topia", this)); - } + initSecurity(); } /** @@ -418,8 +403,12 @@ } // ajout des classes dites persistentes - String[] classes = getConfig().getProperty( - TOPIA_PERSISTENCE_CLASSES, "").split(","); + String listPersistenceClasses = getConfig().getProperty( + TOPIA_PERSISTENCE_CLASSES, ""); + if(getSecurityManager() != null) { + listPersistenceClasses += "," + securityManager.getPersistenceClasses(); + } + String[] classes = listPersistenceClasses.split(","); for (String classname : classes) { classname = classname.trim(); if (!"".equals(classname)) { @@ -1362,24 +1351,28 @@ } /** - * Initialise la variable securityType en fonction des + * Initialise le TopiaSecurityManager en fonction des * propriétés du context. Si le type n'est pas connu, la variable reste à * null. */ - protected void initSecurityType() { - if (parentContext != null) { - securityType = parentContext.getSecurityType(); - } else { - Properties props = getConfig(); - if (props == null) { - securityType = null; - } else { - securityType = props.getProperty("topia.authentication"); - //Si le type n'est pas connu, on remet le securityType à null - if (!"topia".equalsIgnoreCase(securityType) && - !"ldap".equalsIgnoreCase(securityType)) { - log.warn("Type de sécurité inconnu : " + securityType); - securityType = null; + protected void initSecurity() { + Properties props = getConfig(); + securityManager = null; + if (props != null) { + String classSecurityManger = props.getProperty(TOPIA_SECURITY_MANAGER); + try { + Class forName = Class.forName(classSecurityManger); + Constructor constructor = forName.getConstructor(TopiaContext.class); + Object newInstance = constructor.newInstance(this); + securityManager = (TopiaSecurityManager) newInstance; + securityManager.init(); + } catch (Throwable eee) { + eee.printStackTrace(); + if(log.isWarnEnabled() || log.isErrorEnabled()) { + log.warn("Type de sécurité inconnu : " + classSecurityManger); + } + if(log.isErrorEnabled()) { + log.error(eee); } } } @@ -1389,74 +1382,20 @@ * @see org.codelutin.topia.framework.TopiaContextImplementor#isSecurityEnabled() */ public boolean isSecurityEnabled() { - return (getSecurityType() != null); - } - - /* (non-Javadoc) - * @see org.codelutin.topia.framework.TopiaContextImplementor#getSecurityType() - */ - public String getSecurityType() { - //Si le securityType est null, on retente la lecture des propriétés - if (securityType == null) { - initSecurityType(); - } - return securityType; - } - - /* (non-Javadoc) - * @see org.codelutin.topia.framework.TopiaContextImplementor#getUserManager() - */ - public TopiaUserManager getUserManager() { - if (getParentContext() != null) { - return getParentContext().getUserManager(); - } - if (userManager == null) { - //L'appel à isSecurityEnabled va forcer l'initialisation du securityType - if (isSecurityEnabled()) { - if ("topia".equalsIgnoreCase(securityType)) { - try { - userManager = new TopiaHibernateUserManager(this); - } catch (TopiaException te) { - log.error("Recuperation du userManager impossible", te); - } - } else if ("ldap".equalsIgnoreCase(securityType)) { -// userManager = new TopiaLDAPUserManager(this); - } else { - log.warn("Type de sécurité inconnu : " + securityType); - } - } else { - userManager = null; - } - } - return userManager; + return securityManager != null; } - /* (non-Javadoc) - * @see org.codelutin.topia.framework.TopiaContextImplementor#getPermissionManager() + /* + * (non-Javadoc) + * @see org.codelutin.topia.TopiaContext#getTopiaSecurityManager() */ - public TopiaPermissionManager getPermissionManager() { - if (getParentContext() != null) { - return getParentContext().getPermissionManager(); + public TopiaSecurityManager getSecurityManager() { + TopiaContextImplementor parent = getParentContext(); + if(parent != null) { + return parent.getSecurityManager(); + } else { + return securityManager; } - if (permissionManager == null) { - //L'appel à isSecurityEnabled va forcer l'initialisation du securityType - if (isSecurityEnabled()) { - if ("topia".equalsIgnoreCase(securityType)) { - try { - permissionManager = new TopiaHibernatePermissionManager(this); - } catch (TopiaException te) { - log.error("Recuperation du permissionManager impossible", te); - } - } else if ("ldap".equalsIgnoreCase(securityType)) { -// userManager = new TopiaLDAPUserManager(this); - } else { - log.warn("Type de sécurité inconnu : " + securityType); - } - } else { - permissionManager = null; - } - } - return permissionManager; } /**