register.html ( 회원 가입 페이지)
- tyymeleaf 사용
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>register.html</title>
</head>
<body>
<h2> 회원가입 하기</h2> <hr>
<form action="/saveRegister" method="post" name="registerForm">
<input type="text" name="username" placeholder="username"> <br>
<input type="password" name="password" placeholder="password">
<input type="submit" value="register">
</form>
</body>
</html>
userDto
- 회원 가입 시에 전달받은 회원 데이터를 담는 객체
package com.example.securitytest.dto;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class UserDto { // 회원 가입한 회원 데이터를 받음
private String username;
private String password;
}
RegisterController
- 회원 가입 정보를 userDto를 통해 매개변수로 받아서 registerService로 전달
package com.example.securitytest.controller;
import com.example.securitytest.dto.UserDto;
import com.example.securitytest.service.RegisterService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import lombok.RequiredArgsConstructor;
@Controller
@RequiredArgsConstructor
public class RegisterController {
// 생성자 주입 방식으로 의존성 주입 권장
private final RegisterService registerService;
// 회원 가입 데이터 저장
@PostMapping("/saveRegister")
public String saveRegister(UserDto userDto) {
registerService.register(userDto);
return "redirect:/"; // main 화면
}
// 회원 가입 화면
@GetMapping("/register")
public String register() {
return "register";
}
}
RegisterService
package com.example.securitytest.service;
import com.example.securitytest.dto.UserDto;
import com.example.securitytest.entity.UserEntity;
import com.example.securitytest.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class RegisterService {
private final UserRepository userRepository;
private final BCryptPasswordEncoder bCryptPasswordEncoder; // 암호화 관련
public void register(UserDto userDto) {
// 1.db에 이미 동일한 username을 가진 회원이 존재하는지를 DB애서 검증
boolean isUser = userRepository.existsByUsername(userDto.getUsername());
if( isUser ) {
System.out.println("이미 가입된 정보가 있어 회원가입이 진행되지 않음");
return; // 아래의 코드를 실행하지 않고 돌아감
}
// 2.동일한 회원이 없을 때는 회원가입을 진행
//회원 정보인dto를 DB에 저장하기 위해 entity로 변경
UserEntity entityData = new UserEntity(); // 빈 객체 생성
entityData.setUsername(userDto.getUsername());
entityData.setPassword(bCryptPasswordEncoder.encode(userDto.getPassword())); // 비밀번호 암호화 진행
entityData.setRole("ROLE_USER"); // 역할 : ROLE_USER, ROLE_ADMIN (사용자, 관리자)
userRepository.save(entityData);
}
}
[ registerService ]
- DB에 회원가입 정보를 저장하는 메서드를 작성할 때,
전달받은 매개변수인 userDto내의 password는 암호화 되어있지 않는 상태
- DB에 저장하기 위해 userEntity로 변환하는 과정에서, 비밀번호 암호화 진행 필요entityData.setPassword( bCryptPasswordEncoder.encode( userDto.getPassword() ) );
- bCryptPasswordEncoder : 이전에 security Config 클래스에서 설정 완료
package com.example.test.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { // 1.암호화 메서드 등록: 회원 가입 시, 호출하여 암호화 사용 가능 @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
UserEntity
package com.example.securitytest.entity;
import jakarta.persistence.*;
import lombok.Data;
@Entity // Entity를 기반으로 DB테이블을 만들어주는 hibernate 설정 필요
@Data
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // id값(고유번호) 자동으로 생성
private int id;
@Column(unique = true) // username이 중복되지 않도록 unique 설정(아이디 중복 금지)
private String username;
private String password;
private String role; // 권한 저장: 일반인(USER), 관리자(ADMIN)
}
RegisterRepository
- DB와 연결
- userEntity라는 데이터를 가지고 DB에 접근할 인터페이스
package com.example.securitytest.repository;
import com.example.securitytest.dto.UserDto;
import com.example.securitytest.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<UserEntity, Integer> {
// 커스텀 jpa 구문
boolean existsByUsername(String username);
}
'SPRINGBOOT' 카테고리의 다른 글
[spring security] 7. 로그인 검증(인증), UserDetails, UserDetailsService (1) | 2024.01.11 |
---|---|
[spring security] 5. DB 연결하기 (0) | 2024.01.10 |
[spring security] 3. springconfig 설정 : BCrype 암호화 메서드 (0) | 2024.01.10 |
[spring security] 2. 인증과 인가, securityConfig 설정 (1) | 2024.01.10 |
[SpringBoot] DAO와 Mapper 인터페이스의 차이? (0) | 2024.01.10 |