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";
    }

 

이제 회원가입을 해보면