Back Forum Reply New

How to implement ObjectDefinitionSource interface

I want to implement the interface FilterInvocationDefinitionSource as the reference document says 'The FilterSecurityInterceptor can be configured with configuration attributes in two ways. The first is via a property editor and the application context, which is shown above. The second is via writing your own ObjectDefinitionSource', so I write my own implementation follow the PathBasedFilterInvocationDefinitionMap class.But How to let it work?Do I need more configuration?

Here is my code:

Code:
public class FilterInvocationDefinitionSourceImpl
extends AbstractFilterInvocationDefinitionSource
implements FilterInvocationDefinitionMap#123;
   private boolean convertuclToLowercaseBeforeComparison = false;   private Map requestMap = new HashMap#40;#41;;//Store the ucl and role map
   public FilterInvocationDefinitionSourceImpl#40;#41;#123;
   #125;   //Configured in Spring application context for initializing requestMap   public void init#40;#41;#123;     //The following code is only demo.   Map map = new HashMap#40;#41;;   ConfigAttributeDefinition configDefine1 = new ConfigAttributeDefinition#40;#41;;   SecurityConfig securityConfig11 = new SecurityConfig#40;quot;ROLE_USERquot;#41;;   SecurityConfig securityConfig12 = new SecurityConfig#40;quot;ROLE_SUPERVISERquot;#41;;   configDefine1.addConfigAttribute#40;securityConfig11#41;;   configDefine1.addConfigAttribute#40;securityConfig12#41;;      map.put#40;quot;/*.actionquot;,configDefine1#41;;   Iterator it = map.keySet#40;#41;.iterator#40;#41;;   String key = quot;quot;;   ConfigAttributeDefinition attr = null;   while#40;it.hasNext#40;#41;#41;#123;   key = #40;String#41;it.next#40;#41;;   ConfigAttributeDefinition c = #40;ConfigAttributeDefinition#41;map.get#40;key#41;;   Iterator ci = c.getConfigAttributes#40;#41;;   while#40;ci.hasNext#40;#41;#41;#123;   ConfigAttribute ct = #40;ConfigAttribute#41;ci.next#40;#41;;   #125;   this.addSecureucl#40;key,c#41;;   #125;   #125;   /***************Implemente interface FileterInvocationDefinitionMap Begin********************/
/*** @return Returns the convertuclToLowercaseBeforeComparison.*/
public boolean isConvertuclToLowercaseBeforeComparison#40;#41; #123;
return convertuclToLowercaseBeforeComparison;
#125;
/*** @param convertuclToLowercaseBeforeComparison The convertuclToLowercaseBeforeComparison to set.*/
public void setConvertuclToLowercaseBeforeComparison#40;
boolean convertuclToLowercaseBeforeComparison#41; #123;
this.convertuclToLowercaseBeforeComparison = convertuclToLowercaseBeforeComparison;
#125;
/* #40;non-Javadoc#41;* @see net.sf.acegisecurity.intercept.web.FilterInvocationDefinitionMap#addSecureucl#40;java.lang.String, net.sf.acegisecurity.ConfigAttributeDefinition#41;*/
public void addSecureucl#40;String expression, ConfigAttributeDefinition attr#41; #123;
this.requestMap.put#40;expression,attr#41;;
#125;
/***************Implemente interface FileterInvocationDefinitionMap End********************/
/* #40;non-Javadoc#41;* @see net.sf.acegisecurity.intercept.web.AbstractFilterInvocationDefinitionSource#lookupAttributes#40;java.lang.String#41;*/
public ConfigAttributeDefinition lookupAttributes#40;String ucl#41; #123;       if #40;convertuclToLowercaseBeforeComparison#41; #123;ucl = ucl.toLowerCase#40;#41;;       #125;              if#40;this.requestMap.containsKey#40;ucl#41;#41;#123;       return #40;ConfigAttributeDefinition#41;this.requestMap.get#40;ucl#41;;       #125;
return null;
#125;
/* #40;non-Javadoc#41;* @see net.sf.acegisecurity.intercept.ObjectDefinitionSource#getConfigAttributeDefinitions#40;#41;*/
public Iterator getConfigAttributeDefinitions#40;#41; #123;       return this.requestMap.values#40;#41;.iterator#40;#41;;
#125;
Here is my Spring application context configure:

Code:   lt;bean id=quot;filterInvocationInterceptorquot; class=quot;net.sf.acegisecurity.intercept.web.FilterSecurityInterceptorquot;gt;     lt;property name=quot;authenticationManagerquot;gt;lt;ref bean=quot;authenticationManagerquot;/gt;lt;/propertygt;     lt;property name=quot;accessDecisionManagerquot;gt;lt;ref local=quot;fromRequestAccessDecisionManagerquot;/gt;lt;/propertygt;     lt;property name=quot;objectDefinitionSourcequot;gt;lt;ref bean=quot;objectDefinitionSourcequot;/gt;lt;/propertygt;   lt;/beangt;
And

Code:
lt;bean id=quot;objectDefinitionSourcequot;
class=quot;com.br.erp.security.acegi.intercept.web.FilterInvocationDefinitionSourceImplquot; init-method=quot;initquot;gt;
lt;property name=quot;convertuclToLowercaseBeforeComparisonquot;gt;
lt;valuegt;truelt;/valuegt;
lt;/propertygt;
lt;/beangt;
When I navigate to the protected page, the security doesn't work and I still can execute this ucl.

Perhaps I need more

Check your DEBUG logs and they will reveal which ConfigAttributeDefinition is being returned to FilterSecurityInterceptor.

Just glancing over your code, I think your lookupAttributes method needs to properly match the request URI path to your Map key. Add some logging around there to see what it is receiving into the method, and what it is returning from the method, and I think you'll be able to sort the problem out.

Thanks Ben, you are right, this problem is rosolved. :
¥
Back Forum Reply New