2012년 1월 2일 월요일

basic spring security

web.xml
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

   <display-name>Spring MVC Application</display-name>
   
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
              /WEB-INF/spring/root-context.xml
              /WEB-INF/spring/security.xml
        </param-value>
    </context-param>
   
    <!-- Spring MVC -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
   
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Spring Security -->
    <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>

</web-app>


servlet-context.xml (dispatcher-servlet.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
   
    <!-- Enables the Spring MVC @Controller programming model -->
   
   
    <annotation-driven />
    <context:component-scan base-package="com.company.demo" />
   

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
   
</beans:beans>


security.xml
<?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-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <debug/>              
    <http auto-config="true">
        <intercept-url pattern="/**" access="ROLE_USER"/>
    </http>
   
   
    <authentication-manager>
     <authentication-provider>
      <user-service>
        <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
        <user name="bob" password="12345" authorities="ROLE_USER" />
      </user-service>
     </authentication-provider>
   </authentication-manager>
</beans:beans>

example. Controller
@Controller
public class HomeController {

    @RequestMapping (value="/",method=RequestMethod.GET)
    public String home(Locale locale,Model model){
       
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        String formattedDate = dateFormat.format(date);
       
        model.addAttribute("serverTime", formattedDate );
        return "home";
    }
}


No bean named 'springSecurityFilterChain' is defined

spring security 설정중에 실수 하기 쉬운것

web.xml에 security 설정중에 -- security.xml을 servletContext에 넣으면
예)
<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                          /WEB-INF/spring/servlet-context.xml
                          /WEB-INF/spring/security.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
이렇게 Servlet 안에 넣으면 서버 초기화시에 security.xml 을 잘 설정하였다고 하더라도
No bean named 'springSecurityFilterChain' is defined 메시지가 출력되는것은


security.xml 은 Context root 에 설정이 되어야 하기 때문에 발생한다
따라서 설정은 다음과 같이
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
              /WEB-INF/spring/root-context.xml
              /WEB-INF/spring/security.xml
        </param-value>
    </context-param>
설정하면 문제없이 초기화 된다 ..


security.xml 최소 설정
<http>
        <intercept-url pattern="/**" access="ROLE_USER" />
</http>

2011년 12월 11일 일요일

javax.validation.ValidationException: Unable to find a default provider

If you are using Maven, you must add a dependency to the Hibernate Validator Annotation Processor.


<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator-annotation-processor</artifactId>
  <version>4.1.0.Final</version>
</dependency>

Add - com.springsource.org.hibernate.validator.jar

2011년 12월 7일 수요일

Spring Web.xml and Annotation Configurer


 <servlet>
     <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

   <servlet-mapping>
     <servlet-name>dispatcher</servlet-name>
     <url-pattern>/*</url-pattern>
   </servlet-mapping>

---------------------------------------------------------------------------------

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import
       org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;



public class WebAppInitializer implements WebApplicationInitializer {


       @Override
public void onStartup(ServletContext servletContext) throws ServletException {




        AnnotationConfigWebApplicationContext dispatcherContext =
                                                          new AnnotationConfigWebApplicationContext();
dispatcherContext.register(DispatcherConfig.class);

ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("dispatcher",
                                                 new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");

       }

}

Spring ContextInfomation example



HomeController


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;



@Controller
public class HomeController {

@RequestMapping (value="/test", method=RequestMethod.GET)
public ModelAndView test (){
System.out.println("Welcome Home Controller!");
UserImpl user = new UserImpl();

System.out.println( user.getUser());

ModelAndView model = new ModelAndView("Test");
model.addObject("message", "한글메시지 model.addObject 로 전달");
model.addObject("userMessage",user);
return model;
}
}




<%@page import="org.springframework.web.servlet.ModelAndView"%>
<%@page import="org.springframework.web.servlet.ViewRendererServlet"%>
<%@page import="org.springframework.web.context.WebApplicationContext"%>
<%@page import="org.springframework.web.servlet.support.RequestContextUtils"%>
<%@page import="java.util.Locale"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="org.springframework.context.ApplicationContext"%>
<%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ include file="/WEB-INF/jsp/include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
      <p>sample Data </p><c:out value="${testData}"></c:out>
   
      <fmt:message key="main.title.name"></fmt:message>
      <fmt:message key="main.header"></fmt:message>    
<%
        Enumeration<?> e = request.getAttributeNames();
        HashMap<String,Object> map = new HashMap<String,Object>();

        out.println ("Locale is " + response.getLocale());
        out.println ("<table border='1'>");

        while (e.hasMoreElements()){
    String temp = e.nextElement().toString();
    map.put(temp, request.getAttribute(temp));
       out.println ("<tr><td>" + temp + "</td><td>" +  map.get(temp)  + "</td></tr>");
         }

        out.println ("</table>");

       WebApplicationContext webContext =
                            RequestContextUtils.getWebApplicationContext(request);

   
      SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd : HH:mm:ss");
%>  
</body>
</html>

Spring 3.x Annotation WebApplicaitonInitializer / without web.xml


package com.domain.config;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class WebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {

AnnotationConfigWebApplicationContext rootContext =
                                           new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class);

servletContext.addListener(new ContextLoaderListener(rootContext));

AnnotationConfigWebApplicationContext dispatcherContext =
                                           new   AnnotationConfigWebApplicationContext();
dispatcherContext.register(DispatcherConfig.class);

ServletRegistration.Dynamic dispatcher =
                       ServletContext.addServlet("dispatcher", new  DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}

}



package com.domain.config;

public class AppConfig {

}


package com.domain.config;



import java.util.List;

import javax.inject.Inject;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.core.env.Environment;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.tiles2.TilesConfigurer;


@Configuration
@EnableWebMvc
@ComponentScan (basePackages = "com.domain")
public class DispatcherConfig extends WebMvcConfigurerAdapter {

@Inject
private Environment environment;
private final Log logger = LogFactory.getLog(getClass());
// implementing WebMvcConfigurer

@Bean 
public ViewResolver viewResolver (){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
//-----------------------------------------//
// Configures Tiles at application startup //
//-----------------------------------------//
@Bean
public TilesConfigurer tilesConfigurer(){
TilesConfigurer configurer = new TilesConfigurer();
configurer.setDefinitions(new String[]{
 "/WEB-INF/layouts/tiles.xml"
//  "/WEB-INF/views/**/tiles.xml"
});
configurer.setCheckRefresh(true);
return configurer;
}

//-------------------------------------------------------//
// Messages to support internationalization/localization //
//-------------------------------------------------------//
@Bean
public MessageSource messageSource (){
ReloadableResourceBundleMessageSource messageSource 
                 = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("/WEB-INF/messages/messages");
if (environment.acceptsProfiles("embedded")){
messageSource.setCacheSeconds(0);
}
return messageSource;
}

public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
public Validator getValidator() {
logger.info("Validation check ---------------------");
LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
ReloadableResourceBundleMessageSource messageSource = 
                                                                          new ReloadableResourceBundleMessageSource();
messageSource.setBasename("/WEB-INF/messages/validation");
if (environment.acceptsProfiles("embedded")) {
messageSource.setCacheSeconds(0);
}
logger.info(messageSource);
factory.setValidationMessageSource(messageSource);
return factory;
}
// com.springsource.org.codehaus.jackson
// com.springsource.org.codehaus.jackson.mapper
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJacksonHttpMessageConverter());
}
}


package com.domain.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.domain.data.UserImpl;

@Controller
public class HomeController {

@RequestMapping (value="/", method=RequestMethod.GET)
public ModelAndView Home (){
ModelAndView model = new ModelAndView ("Home");
model.addObject("message","messageObject");
return model;
}
}


WebContent/WEB-INF/views/Home.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"  pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
    HomeController Message get  ${message}
    <h1>Welcome Spring Annotation Base Web Configuration </h1>
</body>
</html>


2011년 11월 20일 일요일

SpringFramework MVC Example

스프링 프레임웍 은 유연하게 결합한 웹 응용프로그램을 구축하는데 도움을 준다.
MVC (모델뷰컨트롤러) 디자인패턴은 비지니스로직, 프리센테이션 로직 과 탐색로직을 분리
구현하는데 도움이 된다.