diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index feca861..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore index d1c4e3c..3290dd5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# Compiled class file +#/ Compiled class file *.class /target/ diff --git a/pom.xml b/pom.xml index 629e236..c3dc3ee 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,24 @@ 3.8.1 test + + org.springframework.security + spring-security-config + 4.1.1.RELEASE + compile + + + + org.springframework.security + spring-security-web + 4.1.1.RELEASE + compile + + + log4j + log4j + 1.2.17 + diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 7b0d367..0000000 Binary files a/src/.DS_Store and /dev/null differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store deleted file mode 100644 index 5ddc54c..0000000 Binary files a/src/main/.DS_Store and /dev/null differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store deleted file mode 100644 index 35a54bf..0000000 Binary files a/src/main/java/.DS_Store and /dev/null differ diff --git a/src/main/java/com/.DS_Store b/src/main/java/com/.DS_Store deleted file mode 100644 index 6ffafc6..0000000 Binary files a/src/main/java/com/.DS_Store and /dev/null differ diff --git a/src/main/java/com/packt/.DS_Store b/src/main/java/com/packt/.DS_Store deleted file mode 100644 index d262ee4..0000000 Binary files a/src/main/java/com/packt/.DS_Store and /dev/null differ diff --git a/src/main/java/com/packt/webstore/config/LoginController.java b/src/main/java/com/packt/webstore/config/LoginController.java new file mode 100644 index 0000000..23067ea --- /dev/null +++ b/src/main/java/com/packt/webstore/config/LoginController.java @@ -0,0 +1,17 @@ +package com.packt.webstore.config; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +/** + * ログインコントローラー + * @author hirooka + */ +@Controller +public class LoginController { + @RequestMapping(value = "/login", method = RequestMethod.GET) + public String login(){ + return "login"; + } +} diff --git a/src/main/java/com/packt/webstore/config/SecurityConfig.java b/src/main/java/com/packt/webstore/config/SecurityConfig.java new file mode 100644 index 0000000..150882b --- /dev/null +++ b/src/main/java/com/packt/webstore/config/SecurityConfig.java @@ -0,0 +1,61 @@ +package com.packt.webstore.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + + +/** + * ログインの設定 + * ログインされていない場合これらの設定に従って動作する。 + * @author hirooka + */ +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + //ユーザーの登録 + @Autowired + public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { + auth.inMemoryAuthentication().withUser("john").password("pa55word").roles("USER"); + auth.inMemoryAuthentication().withUser("admin").password("root123").roles("USER", "ADMIN"); + } + + + /** + * 認証のさいのいろいろな設定 + * + * @param httpSecurity + * @throws Exception + */ + @Override + public void configure(HttpSecurity httpSecurity) throws Exception { + + //認証がされていないときに呼び出される。 + //ここで呼び出すページはコントローラーの中で呼び出されるページと同じ + httpSecurity.formLogin().loginPage("/login") + .usernameParameter("userId") + .passwordParameter("password"); + + httpSecurity.formLogin().defaultSuccessUrl("/market/products/add") + .failureUrl("/login?error"); + + //ログアウトが成功した際のページ呼び出し + httpSecurity.logout().logoutSuccessUrl("/login?logout"); + + //許可されていないページへ入った際に呼び出される。 + httpSecurity.exceptionHandling().accessDeniedPage("/login?accessDenied"); + + //ロールによってredirectするページを変更する。 + httpSecurity.authorizeRequests() + .antMatchers("/").permitAll() + .antMatchers("/**/add").access("hasRole('ADMIN')") + .antMatchers("/**/market/**").access("hasRole('USER')"); + + // + httpSecurity.csrf().disable(); + } +} diff --git a/src/main/java/com/packt/webstore/config/SecurityWebApplicationInitializer.java b/src/main/java/com/packt/webstore/config/SecurityWebApplicationInitializer.java new file mode 100644 index 0000000..b33b871 --- /dev/null +++ b/src/main/java/com/packt/webstore/config/SecurityWebApplicationInitializer.java @@ -0,0 +1,13 @@ +package com.packt.webstore.config; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; + +/** + * Spring起動の際にSpring側にセキュリティログインの設定があることを知らせるためのクラス + * + * @author hirooka + * + */ +public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { + +} diff --git a/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java b/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java index 24b8068..16d12d4 100644 --- a/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java +++ b/src/main/java/com/packt/webstore/config/WebApplicationContextConfig.java @@ -1,18 +1,19 @@ package com.packt.webstore.config; +import com.packt.webstore.intercepter.ProcessingTimeLogInterceptor; +import com.packt.webstore.intercepter.PromoCodeInterceptor; 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.ResourceBundleMessageSource; +import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.util.UrlPathHelper; -import java.util.ResourceBundle; - @Configuration @EnableWebMvc @ComponentScan("com.packt.webstore") @@ -47,6 +48,16 @@ public MessageSource messageSource(){ return resource; } + @Bean + public HandlerInterceptor promoCodeInterceptor(){ + PromoCodeInterceptor promoCodeInterceptor = new PromoCodeInterceptor(); + promoCodeInterceptor.setPromoCode("OFF3R"); + promoCodeInterceptor.setOfferRedirect("/market/products"); + promoCodeInterceptor.setErrorRedirect("invalidPromoCode"); + return promoCodeInterceptor; + } + + /** * HandlerMappingの設定 * @@ -58,4 +69,15 @@ public void configurePathMatch(PathMatchConfigurer configurer) { urlPathHelper.setRemoveSemicolonContent(false); configurer.setUrlPathHelper(urlPathHelper); } + + /** + * インターセプターの設定 + * @param registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new ProcessingTimeLogInterceptor()); + registry.addInterceptor(promoCodeInterceptor()) + .addPathPatterns("/**/market/products/specialOffer"); + } } \ No newline at end of file diff --git a/src/main/java/com/packt/webstore/controller/ProductController.java b/src/main/java/com/packt/webstore/controller/ProductController.java index 978017b..a2d2162 100644 --- a/src/main/java/com/packt/webstore/controller/ProductController.java +++ b/src/main/java/com/packt/webstore/controller/ProductController.java @@ -1,7 +1,6 @@ package com.packt.webstore.controller; import com.packt.webstore.domain.Product; -import com.packt.webstore.domain.repository.ProductRepository; import com.packt.webstore.exeption.NoProductsFoundUnderCategoryException; import com.packt.webstore.exeption.ProductNotFoundException; import com.packt.webstore.service.ProductService; @@ -16,8 +15,6 @@ import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.xml.ws.RequestWrapper; import java.util.List; import java.util.Map; @@ -86,7 +83,12 @@ public String processAddNewProductForm(@ModelAttribute("newProduct") Product new return "redirect:/market/products"; } + @RequestMapping("/products/invalidPromoCode") + public String invalidPromoCode(){ + return "invalidPromoCode"; + } + @InitBinder public void initialiseBinder(WebDataBinder binder) { binder.setAllowedFields("productId", "name", @@ -108,6 +110,4 @@ public ModelAndView handleError(HttpServletRequest request, mav.setViewName("productNotFound"); return mav; } - - } diff --git a/src/main/java/com/packt/webstore/intercepter/ProcessingTimeLogInterceptor.java b/src/main/java/com/packt/webstore/intercepter/ProcessingTimeLogInterceptor.java new file mode 100644 index 0000000..0436657 --- /dev/null +++ b/src/main/java/com/packt/webstore/intercepter/ProcessingTimeLogInterceptor.java @@ -0,0 +1,43 @@ +package com.packt.webstore.intercepter; + +import org.apache.log4j.Logger; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * インターセプターの追加 + * レスポンス速度を測る。 + * @author hirooka + */ +public class ProcessingTimeLogInterceptor implements HandlerInterceptor { + + private static final Logger LOGGER = Logger.getLogger(ProcessingTimeLogInterceptor.class); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, + Object o) throws Exception { + long startTime = System.currentTimeMillis(); + request.setAttribute("startTime", startTime); + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, + Object o, ModelAndView modelAndView) throws Exception { + String queryString = request.getQueryString() == null ? "" : "?" + request.getQueryString(); + String path = request.getRequestURL() + queryString; + long startTime = (Long) request.getAttribute("startTime"); + long endTime = System.currentTimeMillis(); + LOGGER.info(String.format("%s millisecond taken to process the request %s", (endTime - startTime), path)); + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, + Object o, Exception e) throws Exception { + //nop + } +} diff --git a/src/main/java/com/packt/webstore/intercepter/PromoCodeInterceptor.java b/src/main/java/com/packt/webstore/intercepter/PromoCodeInterceptor.java new file mode 100644 index 0000000..dd98bab --- /dev/null +++ b/src/main/java/com/packt/webstore/intercepter/PromoCodeInterceptor.java @@ -0,0 +1,41 @@ +package com.packt.webstore.intercepter; + +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class PromoCodeInterceptor extends HandlerInterceptorAdapter { + private String promoCode; + private String errorRedirect; + private String offerRedirect; + + public PromoCodeInterceptor() { + super(); + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, + Object handler) throws Exception { + String givenPromoCode = request.getParameter("promo"); + if (promoCode.equals(givenPromoCode)) { + response.sendRedirect(request.getContextPath() + "/" + offerRedirect); + } else { + response.sendRedirect(errorRedirect); + } + return false; + } + + public void setPromoCode(String promoCode) { + this.promoCode = promoCode; + } + + public void setErrorRedirect(String errorRedirect) { + this.errorRedirect = errorRedirect; + } + + public void setOfferRedirect(String offerRedirect) { + this.offerRedirect = offerRedirect; + } +} diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000..6799911 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,14 @@ +# Root logger option +log4j.rootLogger=INFO, file, stdout +# Direct log messages to a log file +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=/Users/hirookayuukana/Desktop/log/performance.log +log4j.appender.file.MaxFileSize=1MB +log4j.appender.file.MaxBackupIndex=1 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss} %-5p %c{1}:%L - %m%n +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/addProduct.jsp b/src/main/webapp/WEB-INF/views/addProduct.jsp index 51cd9ea..bf26b90 100644 --- a/src/main/webapp/WEB-INF/views/addProduct.jsp +++ b/src/main/webapp/WEB-INF/views/addProduct.jsp @@ -9,6 +9,12 @@ Products +
+
+ English|Dutch + ">Logout +
+
@@ -100,6 +106,7 @@
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/invalidPromoCode.jsp b/src/main/webapp/WEB-INF/views/invalidPromoCode.jsp new file mode 100644 index 0000000..2cedcd7 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/invalidPromoCode.jsp @@ -0,0 +1,29 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + + + + + + Invalid promo code + + +
+
+
+

Invalid Promo Code

+
+
+
+
+ +
+ + diff --git a/src/main/webapp/WEB-INF/views/login.jsp b/src/main/webapp/WEB-INF/views/login.jsp new file mode 100644 index 0000000..8ec2ace --- /dev/null +++ b/src/main/webapp/WEB-INF/views/login.jsp @@ -0,0 +1,66 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +<%@ taglib prefix="spring" + uri="http://www.springframework.org/tags" %> + + + + + + Products + + +
+
+
+

Welcome to Web Store!

+

The one and only amazing web store

+
+
+
+
+
+
+
+
+

Please sign in

+
+
+ +
+ +
+

Invalid username and password.

+
+
+
+

You have been logged out successfully.

+
+
+
+

Access Denied: You are not authorised!

+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+ \ No newline at end of file