From 9f8257c40e78ee725e9158f4911fbce20c0bafe0 Mon Sep 17 00:00:00 2001 From: nahwasa <nahwasa@gmail.com> Date: Tue, 7 Feb 2023 23:19:22 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EB=B8=94=EB=A1=9C=EA=B7=B8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=8B=9C=ED=81=90?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=EB=A5=BC=20=EB=B6=99=EC=97=AC=EB=82=98?= =?UTF-8?q?=EA=B0=80=EB=8A=94=20=EA=B3=BC=EC=A0=95=EC=9D=84=20=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=8B=9C=ED=81=90=EB=A6=AC?= =?UTF-8?q?=ED=8B=B0=20=EA=B4=80=EB=A0=A8=EB=90=9C=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=EB=AA=A8=EB=91=90=20=EC=A0=9C=EC=99=B8=ED=95=9C=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 - .../config/AdminAuthorize.java | 14 ------ .../config/MyUserDetailService.java | 34 --------------- .../config/SpringSecurityConfig.java | 43 ------------------- .../config/UserAuthorize.java | 14 ------ .../controller/AuthorizationController.java | 2 - .../controller/LoginController.java | 30 +++++++++++++ .../controller/ViewController.java | 10 +---- .../domain/Member.java | 5 +-- .../dto/MemberLoginDto.java | 23 ++++++++++ .../service/MemberService.java | 8 ++++ .../service/RegisterMemberService.java | 7 +-- src/main/resources/data.sql | 4 +- 13 files changed, 68 insertions(+), 128 deletions(-) delete mode 100644 src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/AdminAuthorize.java delete mode 100644 src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/MyUserDetailService.java delete mode 100644 src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/SpringSecurityConfig.java delete mode 100644 src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/UserAuthorize.java create mode 100644 src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/LoginController.java create mode 100644 src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/dto/MemberLoginDto.java diff --git a/build.gradle b/build.gradle index 89aeeb7..4a7a1ae 100644 --- a/build.gradle +++ b/build.gradle @@ -13,14 +13,12 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.security:spring-security-test' } tasks.named('test') { diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/AdminAuthorize.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/AdminAuthorize.java deleted file mode 100644 index ddc81e5..0000000 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/AdminAuthorize.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.nahwasa.springsecuritybasicsettingforspringboot3.config; - -import org.springframework.security.access.prepost.PreAuthorize; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ ElementType.METHOD, ElementType.TYPE }) -@Retention(RetentionPolicy.RUNTIME) -@PreAuthorize("hasAnyRole('ADMIN')") -public @interface AdminAuthorize { -} diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/MyUserDetailService.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/MyUserDetailService.java deleted file mode 100644 index 6b4d315..0000000 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/MyUserDetailService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.nahwasa.springsecuritybasicsettingforspringboot3.config; - -import com.nahwasa.springsecuritybasicsettingforspringboot3.domain.Member; -import com.nahwasa.springsecuritybasicsettingforspringboot3.service.MemberService; -import org.springframework.beans.factory.annotation.Autowired; -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.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Component; - -import java.util.Optional; - -@Component -public class MyUserDetailService implements UserDetailsService { - private final MemberService memberService; - - @Autowired - public MyUserDetailService(MemberService memberService) { - this.memberService = memberService; - } - - @Override - public UserDetails loadUserByUsername(String insertedUserId) throws UsernameNotFoundException { - Optional<Member> findOne = memberService.findOne(insertedUserId); - Member member = findOne.orElseThrow(() -> new UsernameNotFoundException("없는 회원입니다 ㅠ")); - - return User.builder() - .username(member.getUserid()) - .password(member.getPw()) - .roles(member.getRoles()) - .build(); - } -} diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/SpringSecurityConfig.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/SpringSecurityConfig.java deleted file mode 100644 index a060d31..0000000 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/SpringSecurityConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.nahwasa.springsecuritybasicsettingforspringboot3.config; - -import jakarta.servlet.DispatcherType; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.SecurityFilterChain; - -import static org.springframework.security.config.Customizer.withDefaults; - -@Configuration -@EnableMethodSecurity -public class SpringSecurityConfig { - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.csrf().disable().cors().disable() - .authorizeHttpRequests(request -> request - .dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() - .requestMatchers("/status", "/images/**", "/view/join", "/auth/join").permitAll() - .anyRequest().authenticated() - ) - .formLogin(login -> login - .loginPage("/view/login") - .loginProcessingUrl("/login-process") - .usernameParameter("userid") - .passwordParameter("pw") - .defaultSuccessUrl("/view/dashboard", true) - .permitAll() - ) - .logout(withDefaults()); - - return http.build(); - } -} \ No newline at end of file diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/UserAuthorize.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/UserAuthorize.java deleted file mode 100644 index c75b3a5..0000000 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/config/UserAuthorize.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.nahwasa.springsecuritybasicsettingforspringboot3.config; - -import org.springframework.security.access.prepost.PreAuthorize; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ ElementType.METHOD, ElementType.TYPE }) -@Retention(RetentionPolicy.RUNTIME) -@PreAuthorize("hasAnyRole('USER')") -public @interface UserAuthorize { -} diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/AuthorizationController.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/AuthorizationController.java index b552b6d..b64538b 100644 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/AuthorizationController.java +++ b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/AuthorizationController.java @@ -11,14 +11,12 @@ @RestController @RequestMapping("/auth") public class AuthorizationController { - private final RegisterMemberService registerMemberService; public AuthorizationController(RegisterMemberService registerMemberService) { this.registerMemberService = registerMemberService; } - @PostMapping("/join") public ResponseEntity<String> join(@RequestBody MemberJoinDto dto) { try { diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/LoginController.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/LoginController.java new file mode 100644 index 0000000..e95856e --- /dev/null +++ b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/LoginController.java @@ -0,0 +1,30 @@ +package com.nahwasa.springsecuritybasicsettingforspringboot3.controller; + +import com.nahwasa.springsecuritybasicsettingforspringboot3.dto.MemberLoginDto; +import com.nahwasa.springsecuritybasicsettingforspringboot3.service.MemberService; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/") +public class LoginController { + private final MemberService memberService; + + public LoginController(MemberService memberService) { + this.memberService = memberService; + } + + @PostMapping("/login-process") + public String login(MemberLoginDto dto) { + boolean isValidMember = memberService.isValidMember(dto.getUserid(), dto.getPw()); + if (isValidMember) + return "dashboard"; + return "login"; + } + + @PostMapping("/logout") + public String logout() { + return "login"; + } +} diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/ViewController.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/ViewController.java index 9902b7c..572fe9f 100644 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/ViewController.java +++ b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/controller/ViewController.java @@ -1,9 +1,5 @@ package com.nahwasa.springsecuritybasicsettingforspringboot3.controller; -import com.nahwasa.springsecuritybasicsettingforspringboot3.config.AdminAuthorize; -import com.nahwasa.springsecuritybasicsettingforspringboot3.config.UserAuthorize; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.userdetails.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -24,20 +20,16 @@ public String joinPage() { } @GetMapping("/dashboard") - public String dashboardPage(@AuthenticationPrincipal User user, Model model) { - model.addAttribute("loginId", user.getUsername()); - model.addAttribute("loginRoles", user.getAuthorities()); + public String dashboardPage(Model model) { return "dashboard"; } @GetMapping("/setting/admin") - @AdminAuthorize public String adminSettingPage() { return "admin_setting"; } @GetMapping("/setting/user") - @UserAuthorize public String userSettingPage() { return "user_setting"; } diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/domain/Member.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/domain/Member.java index 988e372..636efc0 100644 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/domain/Member.java +++ b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/domain/Member.java @@ -1,7 +1,6 @@ package com.nahwasa.springsecuritybasicsettingforspringboot3.domain; import jakarta.persistence.*; -import org.springframework.security.crypto.password.PasswordEncoder; @Entity public class Member { @@ -25,8 +24,8 @@ private Member(Long id, String userid, String pw, String roleUser) { protected Member() {} - public static Member createUser(String userId, String pw, PasswordEncoder passwordEncoder) { - return new Member(null, userId, passwordEncoder.encode(pw), "USER"); + public static Member createUser(String userId, String pw) { + return new Member(null, userId, pw, "USER"); } public Long getId() { diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/dto/MemberLoginDto.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/dto/MemberLoginDto.java new file mode 100644 index 0000000..1210e5a --- /dev/null +++ b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/dto/MemberLoginDto.java @@ -0,0 +1,23 @@ +package com.nahwasa.springsecuritybasicsettingforspringboot3.dto; + +public class MemberLoginDto { + + private String userid; + private String pw; + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getPw() { + return pw; + } + + public void setPw(String pw) { + this.pw = pw; + } +} diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/MemberService.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/MemberService.java index 999310d..c2e7314 100644 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/MemberService.java +++ b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/MemberService.java @@ -19,4 +19,12 @@ public MemberService(MemberRepository repository) { public Optional<Member> findOne(String userId) { return repository.findByUserid(userId); } + + public boolean isValidMember(String userId, String password) { + Optional<Member> member = findOne(userId); + if (member.isPresent()) { + return member.get().getPw().equals(password); + } + return false; + } } diff --git a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/RegisterMemberService.java b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/RegisterMemberService.java index 636cfca..b776918 100644 --- a/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/RegisterMemberService.java +++ b/src/main/java/com/nahwasa/springsecuritybasicsettingforspringboot3/service/RegisterMemberService.java @@ -3,22 +3,19 @@ import com.nahwasa.springsecuritybasicsettingforspringboot3.domain.Member; import com.nahwasa.springsecuritybasicsettingforspringboot3.repository.MemberRepository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service public class RegisterMemberService { - private final PasswordEncoder passwordEncoder; private final MemberRepository repository; @Autowired - public RegisterMemberService(PasswordEncoder passwordEncoder, MemberRepository repository) { - this.passwordEncoder = passwordEncoder; + public RegisterMemberService(MemberRepository repository) { this.repository = repository; } public Long join(String userid, String pw) { - Member member = Member.createUser(userid, pw, passwordEncoder); + Member member = Member.createUser(userid, pw); validateDuplicateMember(member); repository.save(member); diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index ea7af6c..5566c47 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,2 +1,2 @@ -insert into member(userid, pw, roles) values ('nahwasa', '$2a$12$jcKXsj4ZAIkGgZdnUQ6EcOduMlurEtX7Szjhr.kQp2iQXNucjZMI6', 'ADMIN'); -insert into member(userid, pw, roles) values ('user', '$2a$12$jcKXsj4ZAIkGgZdnUQ6EcOduMlurEtX7Szjhr.kQp2iQXNucjZMI6', 'USER'); \ No newline at end of file +insert into member(userid, pw, roles) values ('nahwasa', '1234', 'ADMIN'); +insert into member(userid, pw, roles) values ('user', '1234', 'USER'); \ No newline at end of file From 134b2468f6fbb155fac1e08d0bb7ae2670650397 Mon Sep 17 00:00:00 2001 From: nahwasa <nahwasa@gmail.com> Date: Tue, 7 Feb 2023 23:32:09 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EB=B8=94=EB=A1=9C=EA=B7=B8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=8B=9C=ED=81=90?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=EB=A5=BC=20=EB=B6=99=EC=97=AC=EB=82=98?= =?UTF-8?q?=EA=B0=80=EB=8A=94=20=EA=B3=BC=EC=A0=95=EC=9D=84=20=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=8B=9C=ED=81=90=EB=A6=AC?= =?UTF-8?q?=ED=8B=B0=20=EA=B4=80=EB=A0=A8=EB=90=9C=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=EB=AA=A8=EB=91=90=20=EC=A0=9C=EC=99=B8=ED=95=9C=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20-=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=EB=8F=84=20sessionStorage=EC=97=90=20id=20=EB=8B=B4?= =?UTF-8?q?=EC=95=84=EB=91=90=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=E3=85=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/WEB-INF/views/dashboard.jsp | 18 +++++++++++++----- src/main/webapp/WEB-INF/views/login.jsp | 10 +++++++++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/webapp/WEB-INF/views/dashboard.jsp b/src/main/webapp/WEB-INF/views/dashboard.jsp index 2fb9eeb..0112a25 100644 --- a/src/main/webapp/WEB-INF/views/dashboard.jsp +++ b/src/main/webapp/WEB-INF/views/dashboard.jsp @@ -16,13 +16,11 @@ <h3 class="form-signin-heading text-center mb-5">nahwasa.com</h3> <h3 class="overview-normalize">접속 아이디</h3> - <p> - ${loginId} + <p id='login_id'> </p> <hr/> <h3 class="overview-normalize">역할</h3> - <p> - ${loginRoles} + <p id='pw'> </p> <hr/> <h3 class="overview-normalize">역할에 따른 페이지 이동 권한 확인</h3> @@ -32,8 +30,18 @@ </p> <hr/> <form method="post" action="/logout"> - <button class="btn btn-sm btn-danger btn-block" type="submit">로그아웃</button> + <button class="btn btn-sm btn-danger btn-block" type="submit" id="logout_btn">로그아웃</button> </form> + + <script> + const loginId = document.getElementById('login_id'); + loginId.innerHTML = sessionStorage.getItem('userid'); + + const logoutBtn = document.getElementById('logout_btn'); + logoutBtn.addEventListener('click', () => { + sessionStorage.setItem('userid', ''); + }); + </script> </div> </body> </html> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/login.jsp b/src/main/webapp/WEB-INF/views/login.jsp index 916baad..692126c 100644 --- a/src/main/webapp/WEB-INF/views/login.jsp +++ b/src/main/webapp/WEB-INF/views/login.jsp @@ -27,12 +27,20 @@ <label for="password" class="sr-only">비밀번호</label> <input type="password" id="password" name="pw" class="form-control" placeholder="비밀번호" required=""> </p> - <button class="btn btn-lg btn-primary btn-block" type="submit">로그인</button> + <button class="btn btn-lg btn-primary btn-block" type="submit" id="login_btn">로그인</button> </form> <form class="form-signin" method="get" action="/view/join"> <button class="btn btn-lg btn-warning btn-block" type="submit">회원가입하기</button> </form> + + <script> + const loginBtn = document.getElementById('login_btn'); + + loginBtn.addEventListener('click', () => { + sessionStorage.setItem('userid', document.getElementById('username').value); + }); + </script> </div> </body> </html> \ No newline at end of file