From 41c2dc134afcac155fa67a984bf4efa92f1bedb8 Mon Sep 17 00:00:00 2001 From: Daeil Choi Date: Thu, 2 Feb 2023 18:01:03 +0900 Subject: [PATCH] =?UTF-8?q?Add=20user,=20post=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=ED=8C=90=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/AuditorConfig.java | 9 ++ .../springsecuritystudy/config/MvcConfig.java | 16 ++++ .../{ => config}/PasswordEncoderConfig.java | 2 +- .../{ => config}/SecurityConfig.java | 46 +++++++--- .../SampleController.java} | 14 +-- .../model/BaseTimeEntity.java | 32 +++++++ .../springsecuritystudy/post/Post.java | 46 ++++++++++ .../post/PostController.java | 42 +++++++++ .../springsecuritystudy/post/PostDto.java | 12 +++ .../post/PostRepository.java | 14 +++ .../springsecuritystudy/post/PostService.java | 43 +++++++++ .../springsecuritystudy/post/PostStatus.java | 6 ++ .../springsecuritystudy/user/User.java | 61 +++++++++++++ .../user/UserController.java | 28 ++++++ .../springsecuritystudy/user/UserDto.java | 15 ++++ .../user/UserRepository.java | 9 ++ .../springsecuritystudy/user/UserService.java | 35 ++++++++ src/main/resources/application-local.yml | 15 ++++ src/main/resources/application.yml | 16 ++-- src/main/resources/static/css/signin.css | 32 +++++++ src/main/resources/templates/admin.html | 18 ---- src/main/resources/templates/admin/index.html | 14 +++ src/main/resources/templates/fragments.html | 88 ++++++++++++++++++ src/main/resources/templates/index.html | 27 ++---- src/main/resources/templates/login.html | 24 +++++ src/main/resources/templates/post/index.html | 90 +++++++++++++++++++ src/main/resources/templates/signup.html | 27 ++++++ src/main/resources/templates/user.html | 18 ---- ...lerTest.java => SampleControllerTest.java} | 2 +- 29 files changed, 711 insertions(+), 90 deletions(-) create mode 100644 src/main/java/com/example/springsecuritystudy/config/AuditorConfig.java create mode 100644 src/main/java/com/example/springsecuritystudy/config/MvcConfig.java rename src/main/java/com/example/springsecuritystudy/{ => config}/PasswordEncoderConfig.java (90%) rename src/main/java/com/example/springsecuritystudy/{ => config}/SecurityConfig.java (50%) rename src/main/java/com/example/springsecuritystudy/{HomeController.java => controller/SampleController.java} (61%) create mode 100644 src/main/java/com/example/springsecuritystudy/model/BaseTimeEntity.java create mode 100644 src/main/java/com/example/springsecuritystudy/post/Post.java create mode 100644 src/main/java/com/example/springsecuritystudy/post/PostController.java create mode 100644 src/main/java/com/example/springsecuritystudy/post/PostDto.java create mode 100644 src/main/java/com/example/springsecuritystudy/post/PostRepository.java create mode 100644 src/main/java/com/example/springsecuritystudy/post/PostService.java create mode 100644 src/main/java/com/example/springsecuritystudy/post/PostStatus.java create mode 100644 src/main/java/com/example/springsecuritystudy/user/User.java create mode 100644 src/main/java/com/example/springsecuritystudy/user/UserController.java create mode 100644 src/main/java/com/example/springsecuritystudy/user/UserDto.java create mode 100644 src/main/java/com/example/springsecuritystudy/user/UserRepository.java create mode 100644 src/main/java/com/example/springsecuritystudy/user/UserService.java create mode 100644 src/main/resources/application-local.yml create mode 100644 src/main/resources/static/css/signin.css delete mode 100644 src/main/resources/templates/admin.html create mode 100644 src/main/resources/templates/admin/index.html create mode 100644 src/main/resources/templates/fragments.html create mode 100644 src/main/resources/templates/login.html create mode 100644 src/main/resources/templates/post/index.html create mode 100644 src/main/resources/templates/signup.html delete mode 100644 src/main/resources/templates/user.html rename src/test/java/com/example/springsecuritystudy/{HomeControllerTest.java => SampleControllerTest.java} (98%) diff --git a/src/main/java/com/example/springsecuritystudy/config/AuditorConfig.java b/src/main/java/com/example/springsecuritystudy/config/AuditorConfig.java new file mode 100644 index 0000000..dbd6a6a --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/config/AuditorConfig.java @@ -0,0 +1,9 @@ +package com.example.springsecuritystudy.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class AuditorConfig { +} diff --git a/src/main/java/com/example/springsecuritystudy/config/MvcConfig.java b/src/main/java/com/example/springsecuritystudy/config/MvcConfig.java new file mode 100644 index 0000000..4e92ac7 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/config/MvcConfig.java @@ -0,0 +1,16 @@ +package com.example.springsecuritystudy.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class MvcConfig implements WebMvcConfigurer { + + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index"); + registry.addViewController("/home").setViewName("index"); + registry.addViewController("/admin").setViewName("admin/index"); + registry.addViewController("/login").setViewName("login"); + } +} diff --git a/src/main/java/com/example/springsecuritystudy/PasswordEncoderConfig.java b/src/main/java/com/example/springsecuritystudy/config/PasswordEncoderConfig.java similarity index 90% rename from src/main/java/com/example/springsecuritystudy/PasswordEncoderConfig.java rename to src/main/java/com/example/springsecuritystudy/config/PasswordEncoderConfig.java index edc8091..09c104b 100644 --- a/src/main/java/com/example/springsecuritystudy/PasswordEncoderConfig.java +++ b/src/main/java/com/example/springsecuritystudy/config/PasswordEncoderConfig.java @@ -1,4 +1,4 @@ -package com.example.springsecuritystudy; +package com.example.springsecuritystudy.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/example/springsecuritystudy/SecurityConfig.java b/src/main/java/com/example/springsecuritystudy/config/SecurityConfig.java similarity index 50% rename from src/main/java/com/example/springsecuritystudy/SecurityConfig.java rename to src/main/java/com/example/springsecuritystudy/config/SecurityConfig.java index ae14661..f97e0fb 100644 --- a/src/main/java/com/example/springsecuritystudy/SecurityConfig.java +++ b/src/main/java/com/example/springsecuritystudy/config/SecurityConfig.java @@ -1,15 +1,18 @@ -package com.example.springsecuritystudy; +package com.example.springsecuritystudy.config; import org.springframework.context.annotation.Bean; -import org.springframework.security.config.Customizer; 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.WebSecurityCustomizer; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import com.example.springsecuritystudy.user.UserRepository; import lombok.RequiredArgsConstructor; @@ -18,24 +21,37 @@ import lombok.RequiredArgsConstructor; public class SecurityConfig { private final PasswordEncoder passwordEncoder; + private final UserRepository userRepository; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http - .authorizeHttpRequests(authorize -> authorize - .antMatchers("/", "/example").permitAll() - .antMatchers("/user").hasRole("USER") - .antMatchers("/admin").hasRole("ADMIN") - .anyRequest().authenticated() + .authorizeHttpRequests(auth -> auth + .antMatchers("/", "/home", "/signup", "/example").permitAll() + .antMatchers("/post").hasRole("USER") + .antMatchers("/admin").hasRole("ADMIN") + .anyRequest().authenticated() ) - .httpBasic(Customizer.withDefaults()) - .formLogin(Customizer.withDefaults()) - .logout() - .logoutSuccessUrl("/login") - ; + .formLogin(form -> form + .loginPage("/login") + .defaultSuccessUrl("/") + .permitAll() + ) + .logout(logout -> logout + .deleteCookies("remove") + .invalidateHttpSession(false) + .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) + .logoutSuccessUrl("/") + ); + return http.build(); } + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + return web -> web.ignoring().antMatchers("/css/**", "/js/**", "/h2-console/**"); + } + @Bean public UserDetailsService users() { UserDetails user = User.withUsername("user") @@ -46,6 +62,10 @@ public class SecurityConfig { .password(passwordEncoder.encode("admin")) .roles("ADMIN") .build(); - return new InMemoryUserDetailsManager(user, admin); + UserDetails tester = User.withUsername("test") + .password(passwordEncoder.encode("test")) + .roles("ADMIN", "USER") + .build(); + return new InMemoryUserDetailsManager(user, admin, tester); } } diff --git a/src/main/java/com/example/springsecuritystudy/HomeController.java b/src/main/java/com/example/springsecuritystudy/controller/SampleController.java similarity index 61% rename from src/main/java/com/example/springsecuritystudy/HomeController.java rename to src/main/java/com/example/springsecuritystudy/controller/SampleController.java index 1590fae..9e75637 100644 --- a/src/main/java/com/example/springsecuritystudy/HomeController.java +++ b/src/main/java/com/example/springsecuritystudy/controller/SampleController.java @@ -1,21 +1,11 @@ -package com.example.springsecuritystudy; +package com.example.springsecuritystudy.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller -public class HomeController { - - @GetMapping("/user") - public String user() { - return "user"; - } - - @GetMapping("/admin") - public String admin() { - return "admin"; - } +public class SampleController { @GetMapping("/example") public String example(Model model) { diff --git a/src/main/java/com/example/springsecuritystudy/model/BaseTimeEntity.java b/src/main/java/com/example/springsecuritystudy/model/BaseTimeEntity.java new file mode 100644 index 0000000..bd38ae1 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/model/BaseTimeEntity.java @@ -0,0 +1,32 @@ +package com.example.springsecuritystudy.model; + +import java.time.LocalDateTime; + +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import lombok.Getter; +import lombok.ToString; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Getter +@ToString(callSuper = true) +public abstract class BaseTimeEntity { + + @JsonFormat(timezone = "Asia/Seoul") + @CreatedDate + @Column(nullable = false, updatable = false) + private LocalDateTime createdAt; + + @JsonFormat(timezone = "Asia/Seoul") + @LastModifiedDate + private LocalDateTime updatedAt; +} diff --git a/src/main/java/com/example/springsecuritystudy/post/Post.java b/src/main/java/com/example/springsecuritystudy/post/Post.java new file mode 100644 index 0000000..8719a38 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/post/Post.java @@ -0,0 +1,46 @@ +package com.example.springsecuritystudy.post; + +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import com.example.springsecuritystudy.model.BaseTimeEntity; +import com.example.springsecuritystudy.user.User; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Post extends BaseTimeEntity { + + @Id + @GeneratedValue + private Long id; + private String title; + @Lob + private String content; + @Enumerated(EnumType.STRING) + private PostStatus status; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "USER_ID") + private User user; + + public Post(String title, String content, User user) { + this.title = title; + this.content = content; + this.status = PostStatus.Y; + this.user = user; + } +} diff --git a/src/main/java/com/example/springsecuritystudy/post/PostController.java b/src/main/java/com/example/springsecuritystudy/post/PostController.java new file mode 100644 index 0000000..3078679 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/post/PostController.java @@ -0,0 +1,42 @@ +package com.example.springsecuritystudy.post; + +import java.security.Principal; +import java.util.List; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import lombok.RequiredArgsConstructor; + +@Controller +@RequiredArgsConstructor +@RequestMapping("/post") +public class PostController { + + private final PostService postService; + + @GetMapping + public String findByPost(Principal principal, Model model) { + List posts = postService.findByUserName(principal.getName()); + model.addAttribute("posts", posts); + return "post/index"; + } + + @PostMapping + public String savePost(@ModelAttribute PostDto postDto, Principal principal) { + postService.savePost(principal.getName(), postDto.getTitle(), postDto.getContent()); + return "redirect:post"; + } + + @DeleteMapping + public String deletePost(@RequestParam Long id, Principal principal) { + postService.deletePost(principal.getName(), id); + return "redirect:post"; + } +} diff --git a/src/main/java/com/example/springsecuritystudy/post/PostDto.java b/src/main/java/com/example/springsecuritystudy/post/PostDto.java new file mode 100644 index 0000000..2863535 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/post/PostDto.java @@ -0,0 +1,12 @@ +package com.example.springsecuritystudy.post; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PostDto { + + private String title; + private String content; +} diff --git a/src/main/java/com/example/springsecuritystudy/post/PostRepository.java b/src/main/java/com/example/springsecuritystudy/post/PostRepository.java new file mode 100644 index 0000000..b63bb9f --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/post/PostRepository.java @@ -0,0 +1,14 @@ +package com.example.springsecuritystudy.post; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.example.springsecuritystudy.user.User; + +public interface PostRepository extends JpaRepository { + + List findByUserAndStatus(User user, PostStatus status); + + Post findByIdAndUser(Long id, User user); +} diff --git a/src/main/java/com/example/springsecuritystudy/post/PostService.java b/src/main/java/com/example/springsecuritystudy/post/PostService.java new file mode 100644 index 0000000..03ddfa1 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/post/PostService.java @@ -0,0 +1,43 @@ +package com.example.springsecuritystudy.post; + +import java.util.List; + +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.example.springsecuritystudy.user.User; +import com.example.springsecuritystudy.user.UserRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class PostService { + + private final UserRepository userRepository; + private final PostRepository postRepository; + + @Transactional(readOnly = true) + public List findByUserName(String username) { + User user = getUser(username); + return postRepository.findByUserAndStatus(user, PostStatus.Y); + } + + public Post savePost(String username, String title, String content) { + User user = getUser(username); + return postRepository.save(new Post(title, content, user)); + } + + public void deletePost(String username, Long id) { + User user = getUser(username); + Post post = postRepository.findByIdAndUser(id, user); + postRepository.delete(post); + } + + private User getUser(String username) { + return userRepository.findByUsername(username) + .orElseThrow(() -> new UsernameNotFoundException("유저가 없습니다.")); + } + +} diff --git a/src/main/java/com/example/springsecuritystudy/post/PostStatus.java b/src/main/java/com/example/springsecuritystudy/post/PostStatus.java new file mode 100644 index 0000000..840c154 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/post/PostStatus.java @@ -0,0 +1,6 @@ +package com.example.springsecuritystudy.post; + +public enum PostStatus { + Y, + N +} diff --git a/src/main/java/com/example/springsecuritystudy/user/User.java b/src/main/java/com/example/springsecuritystudy/user/User.java new file mode 100644 index 0000000..840c4a9 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/user/User.java @@ -0,0 +1,61 @@ +package com.example.springsecuritystudy.user; + +import java.util.Collection; +import java.util.Collections; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "users") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class User implements UserDetails { + + @Id + @GeneratedValue + private Long id; + private String username; + private String password; + private String authority; + + public User(String username, String password, String authority) { + this.username = username; + this.password = password; + this.authority = authority; + } + + @Override + public Collection getAuthorities() { + return Collections.singleton((GrantedAuthority) () -> authority); + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/src/main/java/com/example/springsecuritystudy/user/UserController.java b/src/main/java/com/example/springsecuritystudy/user/UserController.java new file mode 100644 index 0000000..182dcba --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/user/UserController.java @@ -0,0 +1,28 @@ +package com.example.springsecuritystudy.user; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import lombok.RequiredArgsConstructor; + +@Controller +@RequiredArgsConstructor +@RequestMapping("/signup") +public class UserController { + + private final UserService userService; + + @GetMapping + public String signupView() { + return "signup"; + } + + @PostMapping + public String signup(@ModelAttribute UserDto userDto) { + userService.signup(userDto.getUsername(), userDto.getPassword()); + return "redirect:login"; + } +} diff --git a/src/main/java/com/example/springsecuritystudy/user/UserDto.java b/src/main/java/com/example/springsecuritystudy/user/UserDto.java new file mode 100644 index 0000000..68549e5 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/user/UserDto.java @@ -0,0 +1,15 @@ +package com.example.springsecuritystudy.user; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UserDto { + + private String username; + private String password; +} diff --git a/src/main/java/com/example/springsecuritystudy/user/UserRepository.java b/src/main/java/com/example/springsecuritystudy/user/UserRepository.java new file mode 100644 index 0000000..2f42730 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/user/UserRepository.java @@ -0,0 +1,9 @@ +package com.example.springsecuritystudy.user; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + Optional findByUsername(String username); +} diff --git a/src/main/java/com/example/springsecuritystudy/user/UserService.java b/src/main/java/com/example/springsecuritystudy/user/UserService.java new file mode 100644 index 0000000..b36f9c7 --- /dev/null +++ b/src/main/java/com/example/springsecuritystudy/user/UserService.java @@ -0,0 +1,35 @@ +package com.example.springsecuritystudy.user; + +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + + public User signup(String username, String password) { + if (userRepository.findByUsername(username).isPresent()) { + throw new RuntimeException("이미 등록된 유저입니다."); + } + return userRepository.save(new User(username, passwordEncoder.encode(password), "ROLE_USER")); + } + + public User signupAdmin(String username, String password) { + if (userRepository.findByUsername(username).isPresent()) { + throw new RuntimeException("이미 등록된 Admin유저입니다."); + } + return userRepository.save(new User(username, passwordEncoder.encode(password), "ROLE_ADMIN")); + } + + public User findByUsername(String username) { + return userRepository.findByUsername(username) + .orElseThrow(() -> new UsernameNotFoundException("존재하지 않는 유저입니다.")); + } + +} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..e52a8f2 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,15 @@ +spring: + h2: + console: + enabled: true + path: /h2-console + + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:security-test; + username: sa + password: + + jpa: + database-platform: org.hibernate.dialect.H2Dialect + show-sql: true diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b2809b0..eac2654 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,14 +1,14 @@ server: port: 8080 - devtools: - livereload: - enabled: true - restart: - enabled: true - thymeleaf: - cache: false + + mvc: + hiddenmethod: + filter: + enabled: true logging: level: root: info -# org.springframework.security: debug + org.springframework.web: debug + sql: error + org.springframework.security: debug diff --git a/src/main/resources/static/css/signin.css b/src/main/resources/static/css/signin.css new file mode 100644 index 0000000..1f8e559 --- /dev/null +++ b/src/main/resources/static/css/signin.css @@ -0,0 +1,32 @@ +.form-signin { + max-width: 330px; + padding: 15px; + margin: 0 auto; +} +.form-signin .form-signin-heading, +.form-signin .checkbox { + margin-bottom: 10px; +} +.form-signin .checkbox { + font-weight: 400; +} +.form-signin .form-control { + position: relative; + box-sizing: border-box; + height: auto; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +.form-signin input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.form-signin input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} \ No newline at end of file diff --git a/src/main/resources/templates/admin.html b/src/main/resources/templates/admin.html deleted file mode 100644 index 7bdc29f..0000000 --- a/src/main/resources/templates/admin.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - Spring-Security-Study - - -

Admin

- 홈으로 - - diff --git a/src/main/resources/templates/admin/index.html b/src/main/resources/templates/admin/index.html new file mode 100644 index 0000000..6a4e202 --- /dev/null +++ b/src/main/resources/templates/admin/index.html @@ -0,0 +1,14 @@ + + + + +
+
+

관리자 페이지

+

당신은 관리자입니다.

+
+ + diff --git a/src/main/resources/templates/fragments.html b/src/main/resources/templates/fragments.html new file mode 100644 index 0000000..2ff9df0 --- /dev/null +++ b/src/main/resources/templates/fragments.html @@ -0,0 +1,88 @@ + + + + + + 스프링 시큐리티 학습용 + + + + + + + + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 358b0f9..5c7bd91 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -1,26 +1,15 @@ - + - - - - - Spring-Security-Study - - + -

Spring Security

- example 페이지 바로가기 - user 페이지 바로가기 - admin 페이지 바로가기 - 로그아웃 +
+
+

안녕, 스프링 시큐리티

+

개인 보안 노트 서비스

+
diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..25e3c06 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,24 @@ + + + + + + + +
+
+ +
+ + diff --git a/src/main/resources/templates/post/index.html b/src/main/resources/templates/post/index.html new file mode 100644 index 0000000..e0d264f --- /dev/null +++ b/src/main/resources/templates/post/index.html @@ -0,0 +1,90 @@ + + + + + + + + +
+ +
+

게시글

+ + + + + + + +
+
+
+

+
+

+
+ + Posted by + on + + + +
+
+
+
+
+
+ + diff --git a/src/main/resources/templates/signup.html b/src/main/resources/templates/signup.html new file mode 100644 index 0000000..3b4cc95 --- /dev/null +++ b/src/main/resources/templates/signup.html @@ -0,0 +1,27 @@ + + + + + + + +
+
+ +
+ + diff --git a/src/main/resources/templates/user.html b/src/main/resources/templates/user.html deleted file mode 100644 index b20e657..0000000 --- a/src/main/resources/templates/user.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - Spring-Security-Study - - -

User

- 홈으로 - - diff --git a/src/test/java/com/example/springsecuritystudy/HomeControllerTest.java b/src/test/java/com/example/springsecuritystudy/SampleControllerTest.java similarity index 98% rename from src/test/java/com/example/springsecuritystudy/HomeControllerTest.java rename to src/test/java/com/example/springsecuritystudy/SampleControllerTest.java index d554b28..0dba731 100644 --- a/src/test/java/com/example/springsecuritystudy/HomeControllerTest.java +++ b/src/test/java/com/example/springsecuritystudy/SampleControllerTest.java @@ -16,7 +16,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest -class HomeControllerTest { +class SampleControllerTest { @Autowired private WebApplicationContext applicationContext;