본문 바로가기

백/spring boot

spring security 강의 - 회원가입

<회원가입 폼>

회원가입 버튼을 누르면 /join으로 post 요청이 가게 된다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>회원가입 페이지</title>
</head>
<body>
<h1>회원가입 페이지</h1>
<hr/>
<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>
</body>
</html>

 

</join 컨트롤러 초안>

@PostMapping("/join")
public @ResponseBody String join(User user){  // 메소드에서 반환되는 값을 HTTP 응답 본문에 직접 쓰도록 지시
    System.out.println(user);
    user.setRole("ROLE_USER");
    userRepository.save(user); 
    return "join";   //@ResponseBody : 반환값인 join이 http response 응답 본문에 쓰이도록 지시한다. 즉, join이 뷰 이름이 아니라 응답 데이터임을 나타냄
}
  • role을 set해준 후 바로 레포지토리에 저장하게 되면 회원가입은 잘된다. But, 시큐리티로 로그인이 불가!! 
  • 패스워드가 암호화되지 않았기 때문에!

-> 따라서 시큐리티로 로그인하기 위해 패스워드를 암호화해서 저장해야 한다

 

<패스워드 암호화하기>

1) Security Config에 BCryptPasswordEncoder를 Bean으로 등록

@Configuration
@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록된다
public class SecurityConfig {

    // @Bean으로 등록해주면 해당 메서드의 리턴되는 오브젝트를 IoC로 등록해준다 -> 아무데서나 쓸 수 있게됨
    @Bean
    public BCryptPasswordEncoder encodePwd(){
        return new BCryptPasswordEncoder();
    }

@Bean을 이용해 빈으로 등록해주면 해당 메서드의 리턴되는 오브젝트를 IoC로 등록해준다 -> 아무데서나 쓸 수 있게됨

 

2) 사용자의 rawPassword를 암호화된 encPassword로 바꿔 저장하기

@PostMapping("/join")
public String join(User user){  // 메소드에서 반환되는 값을 HTTP 응답 본문에 직접 쓰도록 지시
    System.out.println(user);
    user.setRole("ROLE_USER");
    String rawPassword=user.getPassword();
    String encPassword=bCryptPasswordEncoder.encode(rawPassword);
    user.setPassword(encPassword);
    userRepository.save(user); //회원가입은 잘 됨. 비밀번호 1234 -> 시큐리티로 로그인 할 수 없다. 패스워드가 암호화가 안되었기 때문!
    return "redierect:/loginForm";
}

 

3) 확인

mysql workbench에서 user 테이블 조회결과 잘 저장되었음을 확인할 수 있다