Index: topia-service/src/java/org/codelutin/topia/taas/TaasService.java diff -u topia-service/src/java/org/codelutin/topia/taas/TaasService.java:1.12 topia-service/src/java/org/codelutin/topia/taas/TaasService.java:1.13 --- topia-service/src/java/org/codelutin/topia/taas/TaasService.java:1.12 Mon Dec 31 10:20:00 2007 +++ topia-service/src/java/org/codelutin/topia/taas/TaasService.java Fri Mar 7 09:25:37 2008 @@ -1,6 +1,6 @@ /* *##% * Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, - * Cédric Pineau, Benjamin Poussin, + * C�dric Pineau, Benjamin Poussin, * * * This program is free software; you can redistribute it and/or @@ -21,13 +21,13 @@ /* * * TopiaSecurityVetoableListener.java * - * Created: 10 févr. 2006 + * Created: 10 f�vr. 2006 * * @author Arnaud Thimel - * @version $Revision: 1.12 $ + * @version $Revision: 1.13 $ * - * Mise a jour: $Date: 2007-12-31 10:20:00 $ - * par : $Author: ruchaud $ + * Mise a jour: $Date: 2008-03-07 09:25:37 $ + * par : $Author: thimel $ */ package org.codelutin.topia.taas; @@ -63,11 +63,13 @@ import org.codelutin.topia.taas.jaas.TaasLoginModule; import org.codelutin.topia.taas.jaas.TaasPermission; import org.codelutin.topia.taas.jaas.TaasPolicy; -import org.codelutin.topia.taas.jaas.TaasSubject; -import org.codelutin.topia.taas.jaas.TaasSubjectImpl; +import org.codelutin.topia.taas.jaas.TaasSubjectFinder; +import org.codelutin.topia.taas.jaas.TaasSubjectFinderImpl; + +import static org.codelutin.topia.taas.TaasUtil.getPrincipalNames; /** - * Service pour la sécurité + * Service pour la s�curit� *

* Pour utiliser le service taas, il suffit de rajouter les lignes suivantes dans * le TopiaContext.properties :

@@ -91,10 +93,10 @@ private TopiaContextImplementor rootContext; private TaasAccessEntity accessEntity; - private TaasSubject subject; + private TaasSubjectFinder subjectFinder; /** - * Contructeur par défaut + * Contructeur par d�faut */ public TaasService() { } @@ -129,7 +131,7 @@ try { org.hibernate.cfg.Configuration configuration = rootContext.getHibernateConfiguration(); - // Récupération du paramètre pour l'événemnt + // R�cup�ration du param�tre pour l'�v�nemnt String eventString = configuration.getProperty(SERVICE_EVENT); if(eventString != null && !"".equals(eventString)) { Class eventClass = (Class) Class.forName(eventString); @@ -139,13 +141,13 @@ accessEntity = new TaasEntityVetoable(this); } - // Récupération du paramètre pour le subject + // R�cup�ration du param�tre pour le subject String subjectString = configuration.getProperty(SERVICE_SUBJECT); if(subjectString != null && !"".equals(subjectString)) { - Class subjectClass = (Class) Class.forName(subjectString); - subject = subjectClass.newInstance(); + Class subjectClass = (Class) Class.forName(subjectString); + subjectFinder = subjectClass.newInstance(); } else { - subject = new TaasSubjectImpl(); + subjectFinder = new TaasSubjectFinderImpl(); } } catch (Exception e) { @@ -188,7 +190,7 @@ public boolean postInit(TopiaContextImplementor context) { policy.installPolicy(); - // Si pas de configuration autre que celle par défaut + // Si pas de configuration autre que celle par d�faut if(Configuration.getConfiguration() == null) { Configuration.setConfiguration(new TaasConfiguration(SERVICE_NAME, this)); } @@ -204,26 +206,30 @@ } /** - * Permet de récupérer le subject en cours + * Permet de r�cup�rer le subject en cours * @return subject */ - public Subject getSubject() { - return subject.getSubject(); + public Subject findSubject() { + return subjectFinder.findSubject(); } /** - * Permet de vérifier les authorizations sur une collection et de supprimer les données non autorisées - * @param entities collection d'entités + * Permet de v�rifier les authorizations sur une collection et de supprimer les donn�es non autoris�es + * @param entities collection d'entit�s * @param actions actions - * @throws SecurityException en cas d'erreur de sécurité + * @throws SecurityException en cas d'erreur de s�curit� */ public void check(Collection entities, int actions) throws SecurityException { - if (getSubject() != null) { + Subject subj = findSubject(); + if (subj != null) { for (Iterator iterator = entities.iterator(); iterator.hasNext();) { TopiaEntity entity = iterator.next(); try { AccessController.checkPermission(new TaasPermission(entity.getTopiaId(), actions)); } catch (SecurityException se) { + if (log.isDebugEnabled()) { + log.debug(getPrincipalNames(subj) + " does not have permissions to load: " + entity); + } iterator.remove(); } } @@ -233,17 +239,37 @@ } /** - * Permet de vérifier les authorizations - * @param entity entité + * Permet de v�rifier les authorizations + * @param entity entit� * @param actions actions - * @throws SecurityException en cas d'erreur de sécurité + * @throws SecurityException en cas d'erreur de s�curit� */ public void check(TopiaEntity entity, int actions) throws SecurityException { - if (getSubject() != null) { + Subject subj = findSubject(); + if (subj != null) { try { AccessController.checkPermission(new TaasPermission(entity.getTopiaId(), actions)); } catch (SecurityException se) { - throw new SecurityException("Access denied to object \"" + entity.getTopiaId() + "\" for \"" + subject + "\""); + throw new SecurityException("Access denied to object \"" + entity.getTopiaId() + "\" for \"" + getPrincipalNames(subj) + "\""); + } + } else { + throw new SecurityException("Use doAs() and login first"); + } + } + + /** + * Permet de v�rifier les authorizations + * @param entity entit� + * @param actions actions + * @throws SecurityException en cas d'erreur de s�curit� + */ + public void check(String topiaId, int actions) throws SecurityException { + Subject subj = findSubject(); + if (subj != null) { + try { + AccessController.checkPermission(new TaasPermission(topiaId, actions)); + } catch (SecurityException se) { + throw new SecurityException("Access denied to object \"" + topiaId + "\" for \"" + getPrincipalNames(subj) + "\""); } } else { throw new SecurityException("Use doAs() and login first"); @@ -251,13 +277,14 @@ } /** - * Permet de vérifier les authorizations - * @param entity entité + * Permet de v�rifier les authorizations + * @param entity entit� * @param actions actions - * @throws SecurityException en cas d'erreur de sécurité + * @throws SecurityException en cas d'erreur de s�curit� */ public void checkRequestPermission(TopiaEntity entity, int actions) throws SecurityException { - if (getSubject() != null) { + Subject subj = findSubject(); + if (subj != null) { List permissions = getRequestPermission(entity, actions); @@ -265,7 +292,7 @@ try { AccessController.checkPermission(new TaasPermission(entity.getTopiaId(), actions)); } catch (SecurityException se) { - throw new SecurityException("Access denied to object \"" + entity.getTopiaId() + "\" for \"" + subject + "\""); + throw new SecurityException("Access denied to object \"" + entity.getTopiaId() + "\" for \"" + getPrincipalNames(subj) + "\""); } } else { for (Permission permission : permissions) { @@ -273,7 +300,7 @@ AccessController.checkPermission(permission); break; } catch (SecurityException se) { - throw new SecurityException("Access denied to object \"" + entity.getTopiaId() + "\" for \"" + subject + "\""); + throw new SecurityException("Access denied to object \"" + entity.getTopiaId() + "\" for \"" + getPrincipalNames(subj) + "\""); } } } @@ -283,13 +310,14 @@ } /** - * Permet de vérifier les authorizations sur une collection et de supprimer les données non autorisées - * @param entities collection d'entités + * Permet de v�rifier les authorizations sur une collection et de supprimer les donn�es non autoris�es + * @param entities collection d'entit�s * @param actions actions - * @throws SecurityException en cas d'erreur de sécurité + * @throws SecurityException en cas d'erreur de s�curit� */ public void checkRequestPermission(Collection entities, int actions) throws SecurityException { - if (getSubject() != null) { + Subject subj = findSubject(); + if (subj != null) { for (Iterator iterator = entities.iterator(); iterator.hasNext();) { TopiaEntity entity = iterator.next(); @@ -318,10 +346,10 @@ } /** - * Récupération des requests permissions dans les DAOs - * @param entity entité + * R�cup�ration des requests permissions dans les DAOs + * @param entity entit� * @param actions actions - * @return permissions à vérifier + * @return permissions � v�rifier */ public List getRequestPermission(TopiaEntity entity, int actions) { String topiaId = entity.getTopiaId(); @@ -343,4 +371,5 @@ } return permissions; } -} + +} //TaasService Index: topia-service/src/java/org/codelutin/topia/taas/TaasUtil.java diff -u topia-service/src/java/org/codelutin/topia/taas/TaasUtil.java:1.1 topia-service/src/java/org/codelutin/topia/taas/TaasUtil.java:1.2 --- topia-service/src/java/org/codelutin/topia/taas/TaasUtil.java:1.1 Thu Nov 29 16:08:29 2007 +++ topia-service/src/java/org/codelutin/topia/taas/TaasUtil.java Fri Mar 7 09:25:37 2008 @@ -1,6 +1,6 @@ /* *##% * Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, -* Cédric Pineau, Benjamin Poussin, +* C�dric Pineau, Benjamin Poussin, * * * This program is free software; you can redistribute it and/or @@ -21,21 +21,26 @@ /* * * TopiaSecurityUtil.java * -* Created: 15 févr. 2006 +* Created: 15 f�vr. 2006 * * @author Arnaud Thimel -* @version $Revision: 1.1 $ +* @version $Revision: 1.2 $ * -* Mise a jour: $Date: 2007-11-29 16:08:29 $ -* par : $Author: ruchaud $ +* Mise a jour: $Date: 2008-03-07 09:25:37 $ +* par : $Author: thimel $ */ package org.codelutin.topia.taas; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.Principal; +import java.util.HashSet; +import java.util.Set; import java.util.StringTokenizer; +import javax.security.auth.Subject; + import org.apache.commons.lang.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -63,20 +68,20 @@ public static final String DELETE_TEXT = "DELETE"; /** - * Applique un algorithme de hashage sur la chaine de caratère passée en - * paramètre - * @param msg la chaine de caratère sur laquelle on veut opérer le hashage - * @return La chaine de caractère une fois l'algorithme appliqué + * Applique un algorithme de hashage sur la chaine de carat�re pass�e en + * param�tre + * @param msg la chaine de carat�re sur laquelle on veut op�rer le hashage + * @return La chaine de caract�re une fois l'algorithme appliqu� */ public static String hash(String msg) { return digestSHAHex(msg); } /** - * Applique un algorithme de hashage sur la chaine de caratère passée en - * paramètre - * @param msg la chaine de caratère sur laquelle on veut opérer le hashage - * @return La chaine de caractère une fois l'algorithme appliqué + * Applique un algorithme de hashage sur la chaine de carat�re pass�e en + * param�tre + * @param msg la chaine de carat�re sur laquelle on veut op�rer le hashage + * @return La chaine de caract�re une fois l'algorithme appliqu� */ public static String digestSHABase64(String msg) { if (msg == null) { @@ -153,9 +158,9 @@ } /** - * Transforme actions en une chaîne de caractères + * Transforme actions en une cha�ne de caract�res * @param actions les actions sous forme d'un entier - * @return La chaine des actions passé en paramètre + * @return La chaine des actions pass� en param�tre */ public static String actionsInt2String(int actions) { StringBuffer result = new StringBuffer(); @@ -184,7 +189,7 @@ } /** - * Détermine si la classe implémente une interface + * D�termine si la classe impl�mente une interface *

* interface A <---- class B <---- class C *

@@ -196,7 +201,7 @@ * * @param klass la classe * @param iface l'interface - * @return vrai si la classe implémente l'interface sinon faux + * @return vrai si la classe impl�mente l'interface sinon faux */ public static boolean isImplement(Class klass, Class iface) { boolean result = false; @@ -211,4 +216,21 @@ return result; } + + /** + * Renvoie dans un Set les attribut 'name' des principals du Subject passe + * en param + * @param subj + * @return + */ + public static Set getPrincipalNames(Subject subj) { + Set result = new HashSet(); + if (subj != null && subj.getPrincipals() != null) { + for (Principal p : subj.getPrincipals()) { + result.add(p.getName()); + } + } + return result; + } + } //TopiaSecurityUtil