1. 의존성 추가
build.gradle 파일에 의존성을 추가해준다.
spring-boot-starter-security
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-security'
...
}
2. SpringSecurity.java
이걸 추가하면 웹 처음 화면에 기본적으로 제공해주는 로그인 창이 뜨는데 이건 사용하지 않을 것이므로 컨피그를 아래와 같이 추가해준다.
package com.kpmg.lighthouse.tpplatform.tpplatform;
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.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class SpringSecurity extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception{
http
.cors().disable() //cors방지
.csrf().disable() //csrf방지
.formLogin().disable() //기본 로그인 페이지 없애기
.headers().frameOptions().disable();
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
3. 사용자 엔티티 저장하는 서비스단에서 encoder 사용하기
아래 예시와 같이 사용하면 된다.
이때 User 테이블과 JPA레포지토리를 상속한 userRepository가 있다는 것을 가정한다.
@Service("userInfoService")
public class UserInfoService {
@Autowired
UserRepository userRepository;
@Autowired
PasswordEncoder passwordEncoder;
@Transactional
public void encryptPassword(String userPw){
User user = new User();
String enPw = passwordEncoder.encode(userPw);
user.setPw(enPw);
userRepository.save(user);
}
}
이렇게 하고 h2 console로 데이터를 확인해보면 raw password는 볼 수없고 암호화된 패스워드만 보인다.
4. 암호화된 패스워드 일치 여부 확인하기
내가 구글링해본 결과 BCrypPasswordEncoder는 따로 decode 함수를 제공하는 것 같지 않다. 그냥 raw 데이터와 암호화된 데이터가 일치하는지에 대한 여부를 반환하는 matches 함수를 사용해야 한다.
로그인 처리를 위해 사용자가 입력한 패스워드와 사용자 디비에 저장된 암호화된 패스워드가 일치하는지 확인하기 위한 함수를 아래와 같이 사용한다.
@Autowired
PasswordEncoder passwordEncoder;
public Boolean login(String id, String rawPw){
// 이 함수는 user repository에 따로 구현이 되어 있어야 한다.
User user = userRepository.findById(id);
if(passwordEncoder.matches(rawPw, user.getUserPw())){
return true;
} else{
return false;
}
}
'웹 개발 > Spring Boot' 카테고리의 다른 글
Spring Boot) 여러 포트 사용하기 (멀티 커넥트, 다중 포트) (1) | 2021.10.19 |
---|---|
Spring Boot) pfx 인증서로 https 적용하기 (0) | 2021.10.19 |
Spring Boot) resources 폴더 내 파일 다운로드 (0) | 2021.09.11 |
Spring Boot) MaxUploadSizeExceededException 서버 업로드 파일 최대 용량 설정 (0) | 2021.08.24 |
Spring Boot) resource에 저장된 파일 다운로드 (JAR 파일에서도 접근 가능) (0) | 2021.07.21 |