From: <fc...@us...> - 2008-02-20 15:30:19
|
Revision: 663 http://openutils.svn.sourceforge.net/openutils/?rev=663&view=rev Author: fcarone Date: 2008-02-20 07:30:24 -0800 (Wed, 20 Feb 2008) Log Message: ----------- After invocation handler based on security rules added Added Paths: ----------- trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRuleAfterInvocationHandler.java trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRulePredicate.java Added: trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRuleAfterInvocationHandler.java =================================================================== --- trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRuleAfterInvocationHandler.java (rev 0) +++ trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRuleAfterInvocationHandler.java 2008-02-20 15:30:24 UTC (rev 663) @@ -0,0 +1,71 @@ +/* + * Copyright (c) Openmind. All rights reserved. http://www.openmindonline.it + */ +package it.openutils.hibernate.security.filter; + +import it.openutils.hibernate.security.services.SecurityRuleManager; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.acegisecurity.AccessDeniedException; +import org.acegisecurity.Authentication; +import org.acegisecurity.ConfigAttributeDefinition; +import org.acegisecurity.afterinvocation.AfterInvocationProvider; +import org.apache.commons.collections.CollectionUtils; + + +/** + * @author fcarone + * @version $Id: $ + */ +public class SecurityRuleAfterInvocationHandler extends SecurityRuleBaseHandler implements AfterInvocationProvider +{ + + private SecurityRuleManager securityRuleManager; + + /** + * {@inheritDoc} + */ + @SuppressWarnings("unchecked") + public Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config, + Object returnedObject) throws AccessDeniedException + { + if (returnedObject == null) + { + return null; + } + SecurityRulePredicate predicate = new SecurityRulePredicate(authentication, config, securityRuleManager); + + if (returnedObject instanceof Collection) + { + CollectionUtils.filter((Collection) returnedObject, predicate); + } + else if (returnedObject.getClass().isArray()) + { + Object[] objectArray = (Object[]) returnedObject; + List<Object> objectArrayList = Arrays.asList(objectArray); + CollectionUtils.filter(objectArrayList, predicate); + } + else + { + if (!predicate.evaluate(returnedObject)) + { + throw new AccessDeniedException("Access denied"); + } + } + return returnedObject; + } + + /** + * Sets the securityRuleManager. + * @param securityRuleManager the securityRuleManager to set + */ + public void setSecurityRuleManager(SecurityRuleManager securityRuleManager) + { + this.securityRuleManager = securityRuleManager; + } + +} Added: trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRulePredicate.java =================================================================== --- trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRulePredicate.java (rev 0) +++ trunk/openutils-hibernate-security/src/main/java/it/openutils/hibernate/security/filter/SecurityRulePredicate.java 2008-02-20 15:30:24 UTC (rev 663) @@ -0,0 +1,68 @@ +/* + * Copyright (c) Openmind. All rights reserved. http://www.openmindonline.it + */ +package it.openutils.hibernate.security.filter; + +import it.openutils.hibernate.security.dataobject.SecurityRule; +import it.openutils.hibernate.security.services.SecurityRuleManager; + +import java.util.List; + +import org.acegisecurity.Authentication; +import org.acegisecurity.ConfigAttributeDefinition; +import org.apache.commons.collections.Predicate; +import org.apache.commons.lang.StringUtils; +import org.hibernate.proxy.HibernateProxy; + + +/** + * @author fcarone + * @version $Id: $ + */ +public class SecurityRulePredicate implements Predicate +{ + + private Authentication authentication; + + private SecurityRuleManager securityRuleManager; + + private ConfigAttributeDefinition configAttribute; + + private SecurityRuleUtils ruleUtils = new SecurityRuleUtils(); + + /** + * @param authentication The current authentication + * @param configAttribute The config attribute of the current method invocation interceptor + * @param securityRuleManager The security rule manager to retrieve rules from + */ + public SecurityRulePredicate( + Authentication authentication, + ConfigAttributeDefinition configAttribute, + SecurityRuleManager securityRuleManager) + { + this.authentication = authentication; + this.securityRuleManager = securityRuleManager; + this.configAttribute = configAttribute; + } + + /** + * {@inheritDoc} + * If we return false here, the element will be removed from the original collection. + */ + @SuppressWarnings("unchecked") + public boolean evaluate(Object object) + { + List<String> roles = ruleUtils.getRolesFromAuthentication(authentication); + List<SecurityRule> rules = securityRuleManager.getRulesForRoles(ruleUtils.getClassName(object), roles); + + // @todo: this should be configurable + // denyAll by default + if (rules == null || rules.isEmpty()) + { + return false; + } + return (ruleUtils.checkRules(rules, object) && ruleUtils.checkPermissions(rules, configAttribute)); + } + + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |