Published on

springboot security 3. 스프링부트 시큐리티 시큐리티 회원가입

Authors
  • avatar
    Name
    Kil Hyeon Jun
    Twitter

해당 게시물은 이 강의를 보고 제작하게되었습니다.

시큐리티 회원가입

회원가입 페이지

  • joinForm.html
<!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="Password" /> <br />
      <button>회원가입</button>
    </form>
  </body>
</html>

BCryptPasswordEncoder Bean 등록

  • SecurityConfig.java
// 해당 메소드의 리턴되는 오브젝트를 IoC로 등록해준다.
@Bean
public BCryptPasswordEncoder encodePwd() {
    return new BCryptPasswordEncoder();
}

User Entity 생성

  • com.kbox.security1.model 패키지 생성
package com.kbox.security1.model;

import java.sql.Timestamp;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.hibernate.annotations.CreationTimestamp;

import lombok.Data;

@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 JpaRepository 생성

  • com.kbox.security1.repository 패키지 생성
package com.kbox.security1.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.kbox.security1.model.User;

// CRUD 함수를 JpaRepository가 들고 있음
// @Repository라는 어노테이션이 없어도 IoC가 됨. JpaRepository를 상속 했기 때문
public interface UserRepository extends JpaRepository<User, Integer>{

}

IndexController 수정 및 회원가입 구현

package com.kbox.security1.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.kbox.security1.model.User;
import com.kbox.security1.repository.UserRepository;

@Controller // View를 리턴하겠다
public class IndexController {

	@Autowired
	private UserRepository userRepository;

	@Autowired
	private BCryptPasswordEncoder bCryptPasswordEncoder;

	// localhost:8080/
	// localhost:8080
	@GetMapping({"","/"})
	public String index() {
		// 머스태치 기본폴더 src/main/resources/
		// viewReslover 설정 : templates (prefix), .mustach(suffix) 생략 가능
		return "index"; // src/main/resources/templates/index.mustach
	}

	@GetMapping("/user")
	public @ResponseBody String user() {
		return "user";
	}

	@GetMapping("/admin")
	public @ResponseBody String admin() {
		return "admin";
	}

	@GetMapping("/manager")
	public@ResponseBody String manager() {
		return "manager";
	}

	// 스프링시큐리티 해당주소를 낚아챔 - SecurityConfig 파일 생성 후 작동안함.
	@GetMapping("/loginForm")
	public String loginForm() {
		return "loginForm";
	}

	@GetMapping("/joinForm")
	public String joinForm() {
		return "joinForm";
	}

	@PostMapping("/join")
	public String join(User user) {
		user.setRole("ROLE_USER");
		String rawPassword = user.getPassword();
		String encPassword = bCryptPasswordEncoder.encode(rawPassword);
		user.setPassword(encPassword);
		userRepository.save(user); // 회원가입 잘됨. 비밀번호 : 1234 => 시큐리티로 로그인을 할 수 없음. 패스워드가 암호화가 안되었기 때문
		return "redirect:/loginForm";
	}

	@GetMapping("/joinProc")
	public @ResponseBody String joinProc() {
		return "회원가입 완료 됨";
	}

}