이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
Form 인증 - 사용자 등록 / PasswordEncoder
- 비밀번호를 안전하게 암호화 하도록 제공
- Spring Security 5.0 이전에는 기본 PasswordEncoder 가 평문을 지원하는 NoOpPasswordEncode (현재는 Deprecated)
- 생성
- PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder()
- 여러개의 PasswordEncoder 유형을 선언한 뒤, 상황에 맞게 선택해 사용할 수 있도록 지원하는 Encoder이다.
- 암호화 포맷 : {id}encodedPassword
- 알고리즘 종류: bcrypt, noop, pbkdf2, scypt, sha256
- 기본 포맷은 Bcrypt :{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG)
- 인터페이스
- encode(password)
- 패스워드 암호화
matches(rawPassword, encodedPassword)- 패스워드 비교
- encode(password)
실습
Account 도메인 생성
Account
@Entity
@Data
public class Account {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
private String age;
private String role;
}
AccountDto
@Data
public class AccountDto {
private Long id;
private String username;
private String password;
private String age;
private String role;
}
UserRepository 생성
UserRepository
public interface UserRepository extends JpaRepository<Account, Long> {
}
UserService 생성
UserService
public interface UserService {
void createUser(Account account);
}
UserServiceImpl
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional
@Override
public void createUser(Account account) {
userRepository.save(account);
}
}
UserController
UserController
@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PasswordEncoder passwordEncoder;
@GetMapping(value = "/mypage")
public String myPage() throws Exception {
return "user/mypage";
}
@GetMapping("/users")
public String createUser() {
return "user/login/register";
}
@PostMapping("/users")
public String createUser(AccountDto accountDto) {
// modelmapper 라이브러리를 사용한다.
ModelMapper modelMapper = new ModelMapper();
Account account = modelMapper.map(accountDto, Account.class);
account.setPassword(passwordEncoder.encode(account.getPassword()));
userService.createUser(account);
return "redirect:/";
}
}
- 사용자가 "/users" 자원에 접근할 수 있도록 한다.
- PRG (Post/Redirect/Get) 방식을 사용한다.
- ModelMapper를 사용해 AccountDto로 새로운 Account 객체를 생성한다.
- Account 객체의 password 값을 PasswordEncoder를 통해 암호화한다.
- 그 후 데이터베이스에 저장한다.
user/login/register 페이지
user/login/register
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="layout/header::userHead"></head>
<body>
<div th:replace="layout/top::header"></div>
<body>
<div class="container d-flex justify-content-center">
<div style="width:700px; margin-top: 30px;">
<form class="form-horizontal" th:action="@{/users}" method="post">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">아이디</label>
<div class="col-sm-10">
<input type="text" class="form-control input-large" name="username" id="username"
placeholder="username" required>
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">비밀번호</label>
<div class="col-sm-10">
<input type="password" class="form-control input-large" name="password" id="password"
placeholder="Password" data-minlength="6" required>
</div>
</div>
<div class="form-group">
<label for="email" class="col-sm-2 control-label">이메일</label>
<div class="col-sm-10">
<input type="email" class="form-control input-large" name="email" id="email" placeholder="이메일"
required>
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">나이</label>
<div class="col-sm-10">
<input type="text" class="form-control input-large" name="age" id="age" placeholder="나이" required>
</div>
</div>
<div class="form-group">
<label for="role" class="col-sm-2 control-label">권한</label>
<div class="col-sm-10">
<input type="text" class="form-control input-large" name="role" id="role" placeholder="권한" required>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-10">
<button type="Submit" class="btn btn-dark btn-lg">가입하기</button>
</div>
</div>
</form>
</div>
</div>
</body>
</html>
회원가입 메뉴 추가
layout/top.html
- GET 방식으로 /users 경로에 요청을 보낸다.
주의!
생성한 "/users" 경로에 접근할 수 있도록 permitAll() 메소드를 적용시켜야 한다.
실행
'스프링 시큐리티 > 실전프로젝트 - 인증 프로세스 Form 인증 구현' 카테고리의 다른 글
DB 연동 인증 처리(2): CustomAuthenticationProvider (0) | 2023.02.11 |
---|---|
DB 연동 인증 처리(1): CustomUserDetailsService (0) | 2023.02.11 |
정적 자원 관리 - WebIgnore 설정 (0) | 2023.02.10 |
프로젝트 Dependency (0) | 2023.02.10 |
실전 프로젝트 생성 (0) | 2023.02.10 |