PDA

View Full Version : Unable tointercept methods MultiActionController subclass



vloka
Nov 15th, 2004, 08:33 AM
The methods on the SimpleController (subclass of MultiactionController) does not get intercepted.
I want to intercept all methods in SimpleController to enable method level security.
Any help appreciated.

Thanks
Vasanth.



<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<!--
- DispatcherServlet application context for the Spring web MVC
-->
<beans>

<!-- ========================= DEFINITIONS OF PUBLIC CONTROLLERS ========================= -->

<bean id="simpleControllerResolver" class="org.springframework.web.servlet.mvc.multiaction.Pr opertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/simpleController/testRequest.do">testRequest</prop>
</props>
</property>
</bean>

<bean id="simpleController" class="com.sample.web.SimpleController">
<property name="methodNameResolver"><ref local="simpleControllerResolver"/></property>
<property name="sample"><value>EAF Sample</value></property>
<property name="handlerConfigs">
<map>
<entry key="handleRequest">
<ref local="handleRequestConfig"/>
</entry>
</map>
</property>
</bean>

<bean id="securityLogicBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="simpleController"/>
</property>
<property name="interceptorNames">
<list>
<value>methodSecurityAdvisor</value>
</list>
</property>
</bean>

<bean id="methodSecurityAdvisor" class="org.springframework.aop.support.RegexpMethodPointc utAdvisor">
<property name="advice">
<ref local="methodSecurityAdvice"/>
</property>
<property name="pattern">
<value>.*</value>
</property>
</bean>

<bean id="methodSecurityAdvice" class="com.eaf2.security.MethodSecurityAdvice"/>
</beans>
[/color]

irbouho
Nov 15th, 2004, 10:03 PM
I do not see any HandlerMapping in your servlet.xml. That means Spring will use a default HandlerMapping that forwards to simpleController, which is not what you want to do.
You can configure a SimpleUrlHandlerMapping and register securityLogicBean as its default handler. This way, simpleController methods will be intercepted:

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlH andlerMapping">
<property name="defaultHandler"><ref local="simpleController"/></property>
</bean>
HTH

vloka
Nov 16th, 2004, 06:47 AM
Thanks Irbouho -
I had split the servlet.xml in 2 files - app-servlet.xml and controller.xml
the default handler was in app-servlet.xml
I tried combining both in a single file app-servlet.xml and it still does not intercept the methods on the controller.
here is what I now have in the servlet.xml (after combining controller.xml)
And I am still unable to intercept methods on the controller.
=========Begin
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<!--
- DispatcherServlet application context for the Spring web MVC
-->
<beans>

<!-- ========================= VIEW DEFINITIONS ========================= -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResou rceViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/WEB-INF/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>

<!-- ========================= DEFINITIONS OF PUBLIC CONTROLLERS ========================= -->
<!--
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlH andlerMapping">
<property name="interceptors">
<list>
<ref bean="sessionInitializerInterceptor"/>
</list>
</property>
<property name="mappings">
<props>
<prop key="/simpleController/*.do">simpleController</prop>
</props>
</property>
</bean>
-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlH andlerMapping">
<property name="interceptors">
<list>
<ref bean="sessionInitializerInterceptor"/>
</list>
</property>
<property name="defaultHandler"><ref local="simpleController"/></property>
</bean>

<!-- <bean id="sessionInitializerInterceptor" class="com.eaf2.web.interceptor.SessionInitializerInterce ptor"/> -->
<bean id="serviceManagerLoader" class="com.eaf2.service.internal.ServiceManagerLoader"/>


<!-- begin app specific -->
<bean id="sessionInitializerInterceptor" class="com.eaf2.web.interceptor.SessionInitializerInterce ptor"/>

<bean id="simpleControllerResolver" class="org.springframework.web.servlet.mvc.multiaction.Pr opertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/simpleController/testRequest.do">testRequest</prop>
</props>
</property>
</bean>

<bean id="simpleController" class="com.sample.web.SimpleController">
<property name="methodNameResolver"><ref local="simpleControllerResolver"/></property>
<property name="sample"><value>EAF Sample</value></property>
</bean>


<bean id="securityLogicBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--
<property name="proxyInterfaces">
<value>com.sample.web.ISimpleController</value>
</property>
-->
<property name="target">
<ref local="simpleController"/>
</property>
<property name="interceptorNames">
<list>
<value>methodSecurityAdvisor</value>
</list>
</property>
</bean>

<bean id="methodSecurityAdvisor" class="org.springframework.aop.support.RegexpMethodPointc utAdvisor">
<property name="advice">
<ref local="methodSecurityAdvice"/>
</property>
<property name="pattern">
<value>.*</value>
</property>
</bean>

<bean id="methodSecurityAdvice" class="com.eaf2.security.MethodSecurityAdvice"/>
</beans>
=========End

ojolly
Nov 16th, 2004, 06:55 AM
Just a quick thought, shouldn't the default handler be <property name="defaultHandler"><ref local="securityLogicBean"/></property> instead of <property name="defaultHandler"><ref local="simpleController"/></property> . Else, I think you're pointing to the non advised controller ...

HTH

Olivier

vloka
Nov 16th, 2004, 07:11 AM
Good catch.
Thanks Olivier - it works.
Thanks again Irbouho


Just a quick thought, shouldn't the default handler be <property name="defaultHandler"><ref local="securityLogicBean"/></property> instead of <property name="defaultHandler"><ref local="simpleController"/></property> . Else, I think you're pointing to the non advised controller ...

HTH

Olivier