diff --git a/pom.xml b/pom.xml
index d3391e4..5ec9ed2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,6 +50,20 @@
spring-security-test
test
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ com.querydsl
+ querydsl-apt
+
+
+
+ com.querydsl
+ querydsl-jpa
+
diff --git a/src/main/java/com/security/basic/configure/JpaConfiguration.java b/src/main/java/com/security/basic/configure/JpaConfiguration.java
new file mode 100644
index 0000000..14f8ce3
--- /dev/null
+++ b/src/main/java/com/security/basic/configure/JpaConfiguration.java
@@ -0,0 +1,22 @@
+package com.security.basic.configure;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import com.querydsl.jpa.impl.JPAQueryFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+
+@Configuration
+@EnableJpaAuditing
+public class JpaConfiguration {
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Bean
+ public JPAQueryFactory jpaQueryFactory () {
+ return new JPAQueryFactory(em);
+ }
+}
diff --git a/src/main/java/com/security/basic/configure/WebMvcConfigure.java b/src/main/java/com/security/basic/configure/WebMvcConfiguration.java
similarity index 91%
rename from src/main/java/com/security/basic/configure/WebMvcConfigure.java
rename to src/main/java/com/security/basic/configure/WebMvcConfiguration.java
index 8ec786e..c5bfe16 100644
--- a/src/main/java/com/security/basic/configure/WebMvcConfigure.java
+++ b/src/main/java/com/security/basic/configure/WebMvcConfiguration.java
@@ -5,7 +5,7 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
-public class WebMvcConfigure implements WebMvcConfigurer {
+public class WebMvcConfiguration implements WebMvcConfigurer {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/static/", "classpath:/public/", "classpath:/", "classpath:/resources/", "classpath:/META-INF/resources/", "classpath:/META-INF/resources/webjars/"
diff --git a/src/main/java/com/security/basic/persistence/model/Privilege.java b/src/main/java/com/security/basic/persistence/model/Privilege.java
index dbad2db..547c464 100644
--- a/src/main/java/com/security/basic/persistence/model/Privilege.java
+++ b/src/main/java/com/security/basic/persistence/model/Privilege.java
@@ -1,12 +1,15 @@
package com.security.basic.persistence.model;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.util.Collection;
@Entity
+@NoArgsConstructor
@Getter
@Setter
@Table(name = "privileges")
@@ -19,7 +22,7 @@ public class Privilege {
private String name;
- @ManyToMany(mappedBy = "privileges")
+ @ManyToMany(mappedBy = "privileges", fetch = FetchType.EAGER)
private Collection roles;
public Privilege(final String name) {
diff --git a/src/main/java/com/security/basic/persistence/model/Role.java b/src/main/java/com/security/basic/persistence/model/Role.java
index d3c1901..14312c3 100644
--- a/src/main/java/com/security/basic/persistence/model/Role.java
+++ b/src/main/java/com/security/basic/persistence/model/Role.java
@@ -1,6 +1,8 @@
package com.security.basic.persistence.model;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@@ -19,7 +21,7 @@ public class Role {
private String name;
- @ManyToMany(mappedBy = "roles")
+ @ManyToMany(mappedBy = "roles", fetch = FetchType.EAGER)
private Collection users;
@ManyToMany
diff --git a/src/main/java/com/security/basic/persistence/model/User.java b/src/main/java/com/security/basic/persistence/model/User.java
index 8ff21b9..da018a5 100644
--- a/src/main/java/com/security/basic/persistence/model/User.java
+++ b/src/main/java/com/security/basic/persistence/model/User.java
@@ -1,8 +1,6 @@
package com.security.basic.persistence.model;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
import javax.persistence.*;
import java.util.Collection;
@@ -10,6 +8,8 @@ import java.util.Collection;
@Entity
@Builder
+@AllArgsConstructor
+@NoArgsConstructor
@Getter
@Setter
@Table(name = "users")
diff --git a/src/main/java/com/security/basic/security/WebSecurityConfigure.java b/src/main/java/com/security/basic/security/WebSecurityConfigure.java
index 3d90cc0..235406c 100644
--- a/src/main/java/com/security/basic/security/WebSecurityConfigure.java
+++ b/src/main/java/com/security/basic/security/WebSecurityConfigure.java
@@ -39,12 +39,12 @@ public class WebSecurityConfigure {
//permitAll시 해당 url에 대한 인증 정보를 요구하지 않는다.
//authenticated시 해당 url에는 인증 정보를 요구한다.(로그인 필요)
//hasAnyRole시 해당 url에는 특정 권한 정보를 요구한다.
-// http
-// .authorizeRequests()
-// .antMatchers("/login", "/home").permitAll()
+ http
+ .authorizeRequests()
+ .antMatchers("/home").permitAll()
// .antMatchers("/user").hasAnyRole("USER", "ADMIN")
// .antMatchers("/admin").hasAnyRole("ADMIN")
-// .anyRequest().authenticated();
+ .anyRequest().authenticated();
http
.authorizeHttpRequests()
diff --git a/src/main/java/com/security/basic/spring/SetupDataLoader.java b/src/main/java/com/security/basic/spring/SetupDataLoader.java
index 50c372a..f5c1b48 100644
--- a/src/main/java/com/security/basic/spring/SetupDataLoader.java
+++ b/src/main/java/com/security/basic/spring/SetupDataLoader.java
@@ -9,7 +9,9 @@ import com.security.basic.persistence.model.User;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.context.SecurityContextPersistenceFilter;
import org.springframework.stereotype.Component;
import javax.transaction.Transactional;
diff --git a/src/main/java/com/security/basic/web/controller/UserController.java b/src/main/java/com/security/basic/web/controller/UserController.java
new file mode 100644
index 0000000..d2bc73d
--- /dev/null
+++ b/src/main/java/com/security/basic/web/controller/UserController.java
@@ -0,0 +1,40 @@
+package com.security.basic.web.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+@RequiredArgsConstructor
+public class UserController {
+
+ @GetMapping("/home")
+ public String home() {
+ return "/home";
+ }
+
+ @PreAuthorize("hasRole('USER')")
+ @GetMapping("/user")
+ public String user() {
+ return "/user";
+ }
+
+ @PreAuthorize("hasRole('ADMIN')")
+ @GetMapping("/admin")
+ public String admin() {
+ return "/admin";
+ }
+
+ @PreAuthorize("hasAnyAuthority('READ','WRITE')")
+ @GetMapping("/read")
+ public String read() {
+ return "/read";
+ }
+
+ @PreAuthorize("hasAnyAuthority('WRITE')")
+ @GetMapping("/write")
+ public String write() {
+ return "/write";
+ }
+}
diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties
index 7ea9978..74ef0df 100644
--- a/src/main/resources/application-local.properties
+++ b/src/main/resources/application-local.properties
@@ -1,3 +1,6 @@
+# Server Port
+server.port=8008
+
# DataSource Setting
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/basic_security?autoReconnect=true
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 060eec1..3fd9f6a 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,15 +1,19 @@
-server.port=8008
-
# JPA Setting
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.format_sql=true
+spring.jpa.properties.hibernate.id.new_generator_mappings=false
# Logging
spring.output.ansi.enabled=always
-# Redis
-spring.data.redis.repositories.enabled=false
+#Thymeleaf
+spring.thymeleaf.cache=false
+spring.thymeleaf.check-template-location=true
+spring.thymeleaf.prefix=classpath:/templates/
+spring.thymeleaf.suffix=.html
+# Security
+spring.main.allow-bean-definition-overriding=true
\ No newline at end of file
diff --git a/src/main/resources/templates/admin.html b/src/main/resources/templates/admin.html
new file mode 100644
index 0000000..385966d
--- /dev/null
+++ b/src/main/resources/templates/admin.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ SecurityExample
+
+
+ ADMIN
+
+
+
diff --git a/src/main/resources/templates/expired.html b/src/main/resources/templates/expired.html
new file mode 100644
index 0000000..a6f2dd0
--- /dev/null
+++ b/src/main/resources/templates/expired.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ SecurityExample
+
+
+ EXPIRED
+
+
+
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html
new file mode 100644
index 0000000..103e6d7
--- /dev/null
+++ b/src/main/resources/templates/home.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ SecurityExample
+
+
+ HOME
+
+
+
diff --git a/src/main/resources/templates/read.html b/src/main/resources/templates/read.html
new file mode 100644
index 0000000..8a12e69
--- /dev/null
+++ b/src/main/resources/templates/read.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ SecurityExample
+
+
+ READ
+
+
+
diff --git a/src/main/resources/templates/user.html b/src/main/resources/templates/user.html
new file mode 100644
index 0000000..d3604b8
--- /dev/null
+++ b/src/main/resources/templates/user.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ SecurityExample
+
+
+ USER
+
+
+
diff --git a/src/main/resources/templates/write.html b/src/main/resources/templates/write.html
new file mode 100644
index 0000000..6a95794
--- /dev/null
+++ b/src/main/resources/templates/write.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ SecurityExample
+
+
+ WRITE
+
+
+