Spring Security
[기본] 시큐리티 회원가입
ewok
2023. 3. 25. 16:23
IndexController
@GetMapping("/loginForm")
public String loginForm() {
return "loginForm";
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인 페이지</h1>
<hr>
<form>
<input type="text" name="username" placeholder="Username"><br>
<input type="password" name="password" placeholder="Password">
<button>로그인</button>
</form>
</body>
</html>
현재 DB에는 로그인할 수 있는 정보가 없다.
package com.cos.security.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;
import java.sql.Timestamp;
@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; //ROLE_USER, ROLE_ADMIN
@CreationTimestamp
private Timestamp createDate;
}
이렇게 한 뒤 재시작해보면 user 테이블이 생성된다.
IndexController
@GetMapping("/loginForm")
public String loginForm() {
return "loginForm";
}
@GetMapping("/joinForm")
public String joinForm() {
return "joinForm";
}
SecurityConfig
.and().formLogin().loginPage("/loginForm");
그러면 /user로 접속해도
loginForm.html
<form>
<input type="text" name="username" placeholder="Username"><br>
<input type="password" name="password" placeholder="Password">
<button>로그인</button>
</form>
<a href="/joinForm">회원가입을 아직 하지 않으셨나요?</a>
IndexController
@GetMapping("/joinForm")
public String joinForm() {
return "joinForm";
}
joinForm.html 생성
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>회원가입 페이지</title>
</head>
<body>
<h1>회원가입 페이지</h1>
<hr>
<form>
<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>
<form action="/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>
IndexController
@PostMapping("/join")
@ResponseBody
public String join(User user) {
System.out.println(user);
return "join";
}
package com.cos.security.repository;
import com.cos.security.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
// CRUD 함수를 JpaRepository가 들고 있음
// @Repository라는 어노테이션이 없어도 IoC된다. 이유는 JpaRepository를 상속했기 때문
public interface UserRepository extends JpaRepository<User, Integer> {
}
IndexController
@RequiredArgsConstructor
@Controller
public class IndexController {
private final UserRepository userRepository;
...
@PostMapping("/join")
@ResponseBody
public String join(User user) {
System.out.println(user);
user.setRole("ROLE_USER");
userRepository.save(user);
return "join";
}
이렇게 하면 회원가입이 된다. 하지만 비밀번호가 유저가 설정한 비밀번호 그대로 들어가기 때문에 시큐리티로 로그인을 할 수 없다. 왜냐하면 패스워드가 암호화가 되지 않았기 때문이다.
SecurityConfig
@Configuration // IoC 빈(bean)을 등록
public class SecurityConfig {
// 해당 메서드의 리턴되는 오브젝트를 IoC로 등록해준다.
@Bean
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
}
IndexController
@RequiredArgsConstructor
@Controller
public class IndexController {
private final UserRepository userRepository;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
...
@PostMapping("/join")
public String join(User user) {
System.out.println(user);
user.setRole("ROLE_USER");
String rawPassword = user.getPassword();
String encPassword = bCryptPasswordEncoder.encode(rawPassword);
user.setPassword(encPassword);
user.Repository.save(user);
return "redirect:/loginForm";
}
이제 회원가입을 해보면