Spring MVC & Spring Security: About You..
Spring MVC & Spring Security: About You..
&
Spring Security
Craig Walls
About you...
• By show of hands...
• Java 6? Java 5? Java 1.4? Java 1.3? Java 1.2-?
• Spring fanatic
Agenda
• Spring MVC
• Review of Spring MVC pre-2.5
• Spring Security
• Review of Acegi Security 1.0.x
• Summary
• Q&A
In WEB-INF/web.xml:
<servlet>
<servlet-name>roadrantz</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>roadrantz</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
Spring’s Controllers
Command Controller
public class RantsForVehicleController extends AbstractCommandController {
public RantsForVehicleController() {
setCommandClass(Vehicle.class);
setCommandName("vehicle");
}
public AddRantFormController() {
setCommandClass(Rant.class);
setCommandName("rant");
}
Configuring Controllers
In WEB-INF/roadrantz-servlet.xml:
<bean id="homePageController"
class="com.roadrantz.mvc.HomePageController">
<property name="rantService" ref="rantService" />
</bean>
<bean id="rantsForVehicleController"
class="com.roadrantz.mvc.RantsForVehicleController">
<property name="rantService" ref="rantService" />
</bean>
<bean id="addRantController"
class="com.roadrantz.mvc.AddRantFormController">
<property name="formView" value="addRant" />
<property name="successView" value="rantAdded" />
<property name="rantService" ref="rantService" />
</bean>
<bean id="loginController"
class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
Request
Request
Request
Request
Request
Request
Request
Request
Response
Request
Response
• Comes in 5 flavors:
• BeanNameUrlHandlerMapping
• CommonsPathMapHandlerMapping
• ControllerClassNameHandlerMapping
• DefaultAnnotationHandlerMapping
• SimpleUrlHandlerMapping
SimpleUrlHandlerMapping
In WEB-INF/roadrantz-servlet.xml:
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/login.htm=loginController
/home.htm=homePageController
/rantsForVehicle.htm=rantsForVehicleController
/addRant.htm=addRantController
</value>
</property>
</bean>
In WEB-INF/roadrantz-servlet.xml:
<bean id="urlMapping"
class="org.springframework.web.servlet.mvc.support.
ControllerClassNameHandlerMapping" />
View Resolvers
• Map logical view names in ModelAndView to actual
view implementation (ex. a JSP file)
• Come in 9 flavors:
• BeanNameViewResolver
• FreeMarkerViewResolver
• InternalResourceViewResolver
• JasperReportsViewResolver
• ResourceBundleViewResolver
• VelocityLayoutViewResolver
• VelocityViewResolver
• XmlViewResolver
• XsltViewResolver
E-mail: craig@habuma.com Blog: http://www.springloaded.info Source Code: svn://svn.geekisp.com/SiA svn://svn.geekisp.com/habuma
InternalResourceViewResolver
In WEB-INF/roadrantz-servlet.xml:
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<html>
<body>
<h2>Enter a rant...</h2>
<form:form method="POST" action="addRant.htm" commandName="rant">
<b><spring:message code="field.state" /></b>
<rr:stateSelection path="vehicle.state" />
<form:errors path="vehicle.state" cssClass="error"/><br>
<b><spring:message code="field.plateNumber" /></b>
<form:input path="vehicle.plateNumber" />
<form:errors path="vehicle.plateNumber" cssClass="error"/><br>
<b><spring:message code="field.rantText" /></b>
<form:errors path="rantText" cssClass="error"/><br>
<form:textarea path="rantText" rows="5" cols="50" />
<input type="submit"/>
</form:form>
</body>
</html>
• Annotation-driven
<bean class="org.springframework.web.servlet.mvc.annotation.
DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
</beans>
• @Aspect
• @Component
• @Controller
• @Repository
• @Service
DefaultAnnotationHandlerMapping
@Controller
@RequestMapping("/home.htm")
public class HomePageController {
@RequestMapping(method = RequestMethod.GET)
public String showHomePage(ModelMap model) {
model.addAttribute(rantService.getRecentRants());
return "home";
}
@Autowired
RantService rantService;
}
A Form Controller ?
@Controller
@RequestMapping("/addRant.htm")
public class AddRantFormController {
@RequestMapping(method = RequestMethod.GET)
public String setupForm(ModelMap model) {
return "addRant";
}
@ModelAttribute("rant")
public Rant setupRant() {
Rant rant = new Rant();
rant.setVehicle(new Vehicle());
return rant;
}
@ModelAttribute("states")
public String[] getAllStates() { return WebConstants.ALL_STATES;}
@RequestMapping(method = RequestMethod.POST)
protected String addRant(@ModelAttribute("rant")
Rant rant) {
rantService.addRant(rant);
return "rantAdded";
}
@Autowired
RantService rantService;
}
Spring Security
http://netzooid.com/blog/2007/12/03/every-time-you-use-acegi/
In WEB-INF/web.xml:
<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter Proxy
• Offers auto-configuration
In WEB-INF/web.xml:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Simpler Configuration
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-2.0.xsd">
<http auto-config="true">
<intercept-url pattern="/addRant.htm" access="ROLE_MOTORIST" />
<intercept-url pattern="/home.htm" requires-channel="http" />
<intercept-url pattern="/login.htm" requires-channel="https" />
<form-login login-page="/login.htm" />
</http>
<authentication-provider>
• As of 2.0-m4, can’t override SQL. See and (please) vote for SEC-703.
Summary
Is it over yet?
Spring MVC & Security