diff --git a/README.md b/README.md
index 9b5f5f5e0..649581d20 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,9 @@
-[](https://circleci.com/gh/sfg-beer-works/brewery-monolith)
# Brewery Spring MVC Monolith
This repository contains source code examples used to support my on-line courses about the Spring Framework.
You can learn more about the courses here:
-* [Spring Security Core: Beginner to Guru](https://www.udemy.com/course/spring-boot-microservices-with-spring-cloud-beginner-to-guru/?referralCode=6142D427AE53031FEF38)
+* [Spring Security Core: Beginner to Guru](https://www.udemy.com/course/spring-security-core-beginner-to-guru/?referralCode=306F288EB78688C0F3BC)
* [Spring Boot Microservices with Spring Cloud](https://www.udemy.com/course/spring-boot-microservices-with-spring-cloud-beginner-to-guru/?referralCode=6142D427AE53031FEF38)
* [Spring Framework 5: Beginner to Guru](https://www.udemy.com/course/spring-framework-5-beginner-to-guru/?referralCode=6D9ECD1F93988FEE5CE9)
* [Testing Spring Boot: Beginner to Guru](https://www.udemy.com/course/testing-spring-boot-beginner-to-guru/?referralCode=EFFE87DDE96C8541B2EE)
diff --git a/pom.xml b/pom.xml
index df7a6cb36..5eb6742a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -89,6 +89,10 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-security
+
com.h2database
h2
diff --git a/src/main/java/guru/sfg/brewery/config/SecurityConfig.java b/src/main/java/guru/sfg/brewery/config/SecurityConfig.java
new file mode 100644
index 000000000..7e2b4c442
--- /dev/null
+++ b/src/main/java/guru/sfg/brewery/config/SecurityConfig.java
@@ -0,0 +1,28 @@
+package guru.sfg.brewery.config;
+
+import org.springframework.context.annotation.Configuration;
+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;
+
+/**
+ * Created by jt on 6/13/20.
+ */
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http
+ .authorizeRequests(authorize -> {
+ authorize.antMatchers("/", "/webjars/**", "/login", "/resources/**").permitAll()
+ .antMatchers("/beers/find", "/beers*").permitAll();
+ } )
+ .authorizeRequests()
+ .anyRequest().authenticated()
+ .and()
+ .formLogin().and()
+ .httpBasic();
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 912080aaa..f6b0661d1 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,19 +1,3 @@
-#
-# Copyright 2019 the original author or authors.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
spring.application.name=brewery-monolith
spring.jackson.serialization.write-dates-as-timestamps=false
spring.jackson.serialization.write-date-timestamps-as-nanoseconds=true
@@ -23,4 +7,7 @@ spring.messages.basename=messages/messages
logging.level.guru=debug
# Spring Data hangs when not set under Spring Boot 2.3.0
-spring.data.jpa.repositories.bootstrap-mode=default
\ No newline at end of file
+spring.data.jpa.repositories.bootstrap-mode=default
+
+spring.security.user.name=spring
+spring.security.user.password=guru
\ No newline at end of file
diff --git a/src/main/resources/static/resources/application.properties b/src/main/resources/static/resources/application.properties
deleted file mode 100644
index 8d5cc3a7e..000000000
--- a/src/main/resources/static/resources/application.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-# Internationalization
-spring.messages.basename=messages/messages
-
diff --git a/src/test/java/guru/sfg/brewery/web/controllers/BaseIT.java b/src/test/java/guru/sfg/brewery/web/controllers/BaseIT.java
new file mode 100644
index 000000000..eed1ea0f2
--- /dev/null
+++ b/src/test/java/guru/sfg/brewery/web/controllers/BaseIT.java
@@ -0,0 +1,48 @@
+package guru.sfg.brewery.web.controllers;
+
+import guru.sfg.brewery.repositories.BeerInventoryRepository;
+import guru.sfg.brewery.repositories.BeerRepository;
+import guru.sfg.brewery.repositories.CustomerRepository;
+import guru.sfg.brewery.services.BeerService;
+import guru.sfg.brewery.services.BreweryService;
+import org.junit.jupiter.api.BeforeEach;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
+
+/**
+ * Created by jt on 6/13/20.
+ */
+public abstract class BaseIT {
+ @Autowired
+ WebApplicationContext wac;
+
+ MockMvc mockMvc;
+
+ @MockBean
+ BeerRepository beerRepository;
+
+ @MockBean
+ BeerInventoryRepository beerInventoryRepository;
+
+ @MockBean
+ BreweryService breweryService;
+
+ @MockBean
+ CustomerRepository customerRepository;
+
+ @MockBean
+ BeerService beerService;
+
+ @BeforeEach
+ public void setup() {
+ mockMvc = MockMvcBuilders
+ .webAppContextSetup(wac)
+ .apply(springSecurity())
+ .build();
+ }
+}
diff --git a/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerIT.java b/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerIT.java
new file mode 100644
index 000000000..c781e8f74
--- /dev/null
+++ b/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerIT.java
@@ -0,0 +1,37 @@
+package guru.sfg.brewery.web.controllers;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.security.test.context.support.WithMockUser;
+
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+/**
+ * Created by jt on 6/12/20.
+ */
+@WebMvcTest
+public class BeerControllerIT extends BaseIT{
+
+ @WithMockUser("spring")
+ @Test
+ void findBeers() throws Exception{
+ mockMvc.perform(get("/beers/find"))
+ .andExpect(status().isOk())
+ .andExpect(view().name("beers/findBeers"))
+ .andExpect(model().attributeExists("beer"));
+ }
+
+ @Test
+ void findBeersWithHttpBasic() throws Exception{
+ mockMvc.perform(get("/beers/find").with(httpBasic("spring", "guru")))
+ .andExpect(status().isOk())
+ .andExpect(view().name("beers/findBeers"))
+ .andExpect(model().attributeExists("beer"));
+ }
+
+
+
+
+}
diff --git a/src/test/java/guru/sfg/brewery/web/controllers/IndexControllerIT.java b/src/test/java/guru/sfg/brewery/web/controllers/IndexControllerIT.java
new file mode 100644
index 000000000..5140c3acb
--- /dev/null
+++ b/src/test/java/guru/sfg/brewery/web/controllers/IndexControllerIT.java
@@ -0,0 +1,20 @@
+package guru.sfg.brewery.web.controllers;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+/**
+ * Created by jt on 6/13/20.
+ */
+@WebMvcTest
+public class IndexControllerIT extends BaseIT {
+
+ @Test
+ void testGetIndexSlash() throws Exception{
+ mockMvc.perform(get("/" ))
+ .andExpect(status().isOk());
+ }
+}