요구 명세서에 적지는 않지만 어느 프로젝트던 만들어야하는 기능 "회원가입"과 로그인!
오늘 시큐리티 위에서 만들어보자.
시큐리티를 적용하면 이 서비스(지금은 웹!)의 보안을 책임지고 가져가게 된다.
(👍 시큐리티가 라이브러리가 아니고 프레임워크인 이유)
따라서 시큐리티 회원가입에서는 비밀번호 인코딩 하는 과정이 필수적이다.
config 파일에서 BCryptPasswordEncoder
를 빈으로 등록해서 요걸로 인코딩을 하게 된다.
지금은 여기까지만 이해해보자!!
@GetMapping("/login")
public String login() {
return "loginForm";
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지</h1>
<form>
<input type="text" name="username" placeholder="username"/> <br>
<input type="text" name="password" placeholder="password"/> <br>
<button>로그인</button>
</form>
</body>
</html>
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String username;
private String password;
private String email;
private String role;
@CreationTimestamp
private Timestamp createDate;
}
@GetMapping("/loginForm")
public String loginForm() {
return "loginForm";
}
@GetMapping("/joinForm")
public String joinForm() {
return "joinForm";
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>회원가입 페이지</title>
</head>
<body>
<h1>회원가입 페이지</h1>
<form action="/security/join" method="POST">
<input type="text" name="username" placeholder="username"/> <br>
<input type="password" name="password" placeholder="password"/> <br>
<input type="email" name="email" placeholder="email"/> <br>
<button>회원가입</button>
</form>
</body>
</html>
package com.jsh.securitystudy.repository;
import com.jsh.securitystudy.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
//인터페이스인데 실수로 class로 선언해버렸다ㅜㅜ
public interface UserRepository extends JpaRepository<User,Integer> {
}
@Configuration
@EnableWebSecurity
public class MySecurityConfig{
@Bean //빈으로 등록하기
SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
@Bean
public BCryptPasswordEncoder encoderPWD() {
return new BCryptPasswordEncoder();
}
}
@Controller
public class IndexController {
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@PostMapping("/join")
public @ResponseBody String join(User user) {
System.out.println("user = " + user);
user.setRole("USER");
String rawPassword = user.getPassword();
String encPassword = passwordEncoder.encode(rawPassword);
user.setPassword(encPassword); //이거 너무 안전하지 않은 거 아녀?
userRepository.save(user);
return "redirect:loginForm"; //이게 뭐여
}
}
중간에 컨트롤러에서 막~하고 get도 편안하게 쓰고 하는데, 요 부분은 실습을 위해서 그냥 넘어가자..~
🌿 인프런의 최주호 강사님의 스프링부트 시큐리티 & JWT 강의를 참고하는 중
🔗 깃허브 링크