<개발환경>
💻 Apple M1 Pro (macos14.5 on arm64)
🛠️ IDE: IntelliJ
🏁 Language: JAVA17
🔗 Framework: Springboot 3.3.0
⚙️ Project: Gradle
🗄️ Database: MySQL 8.3.0 Homebrew
🖇️ Persistence Framework: MyBatis
🔐 Spring Security 6.3.0
Spring Security 6.x 버전에서 달라진 점!
Spring Boot 3.3.0의 spring-boot-starter-security는 Spring Security 6.3.0을 지원합니다.
springboot3.x 버전에선 spring security6.x 을 기반으로 상당 부분에 변화가 생겼습니다.
Spring Security 6 이상의 버전에서는 deprecated되었던 WebSecurityConfigurerAdapter클래스가 제거되었으며, 대신 SecurityFilterChain을 사용하여 HttpSecurity 보안 구성을 처리합니다.
또한 기존의 AccessDecisionManager를 대체하는 AuthorizationManager 인터페이스가 도입되었습니다.
프로젝트 설정
의존성 추가
- build.gradle
// Spring Boot Security
implementation 'org.springframework.boot:spring-boot-starter-security'
코드 구현
SecurityConfig - Spring Security 설정
- SecurityConfig.java
더보기
@Configuration // Spring 설정 클래스임
@EnableWebSecurity // Spring Security를 활성화
public class SecurityConfig {
@Autowired
private CustomUserDetailsService userDetailsService;
// HTTP 보안 설정을 구성하는 메서드
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorizeRequests -> // HTTP 요청에 대한 보안 규칙을 정의
authorizeRequests
.requestMatchers("/user/**").permitAll() // /user/** 경로에 대한 접근을 허용
.anyRequest().authenticated() // 그 외의 모든 요청은 인증을 요구
)
.csrf(csrf -> csrf.disable());
return http.build(); // HTTP 보안 설정을 빌드하여 반환
}
// 비밀번호 인코더를 정의
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // BCryptPasswordEncoder를 반환. 이는 비밀번호를 암호화하는 데 사용됨
}
}
회원가입 api 구현 (Controller, Request, Dto, Service, Mapper)
- UserController.java
더보기
public class UserController {
private final UserService userService;
private final String EP_ADD_USER = "/signup";
@PostMapping(EP_ADD_USER)
public UserDto.SignUp addUser(@RequestBody UserRequest.SignUpRequest body) {
return userService.signUp(body);
}
}
- UserRequest.java
더보기
public class UserRequest {
@Data
public static class SignUpRequest {
private String username;
private String password;
private String email;
}
}
- UserDto.java
더보기
@NoArgsConstructor
@Data
public class UserDto {
@Data
public static class UserBase {
private String id;
private String username;
@JsonIgnore
private String password;
private String email;
private boolean enabled;
private String role;
private String createdAt;
private String updatedAt;
}
@Data
public static class SignUp extends UserBase{
@Builder
public SignUp(String id,
String username,
String password,
String email,
boolean enabled,
String role,
String createdAt,
String updatedAt) {
setId(id);
setUsername(username);
setPassword(password);
setEmail(email);
setEnabled(enabled);
setRole(role);
setCreatedAt(createdAt);
setUpdatedAt(updatedAt);
}
}
@Data
@Builder
public static class UserSearchByEmailCondition {
private String email;
}
}
- UserMapper.java
더보기
@Mapper
public interface UserMapper {
int signUp(UserDto.SignUp param);
}
- UserService.java
더보기
@Service
@Slf4j
@AllArgsConstructor
public class UserService {
private final UserMapper userMapper;
@Autowired
private PasswordEncoder passwordEncoder;
@Transactional
public UserDto.SignUp signUp(UserRequest.SignUpRequest param) {
// 비밀번호를 BCrypt 형식으로 인코딩
String encodedPassword = passwordEncoder.encode(param.getPassword());
UserDto.SignUp dto = UserDto.SignUp.builder()
.username(param.getUsername())
.password(encodedPassword)
.email(param.getEmail())
.build();
userMapper.signUp(dto);
return dto;
}
}
- UserMapper.xml
더보기
<insert id="signUp"
parameterType="com.tistory.project_api.dto.UserDto$SignUp">
<selectKey keyProperty="id" resultType="string" order="BEFORE">
SELECT CONCAT('U', DATE_FORMAT(NOW(), '%y%m%d'),
LPAD(CAST(COALESCE(MAX(CAST(SUBSTRING(id, 8) AS UNSIGNED)), 0) + 1 AS CHAR), 6, '0')) AS id
FROM user
WHERE SUBSTRING(id, 2, 6) = DATE_FORMAT(NOW(), '%y%m%d');
</selectKey>
INSERT INTO USER (id, username, password, email, enabled, role, created_at, updated_at)
VALUES (#{id}, #{username}, #{password}, #{email}, true, 'user', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
</insert>
GitHub - a-taeyeon/springboot-tistory-example
Contribute to a-taeyeon/springboot-tistory-example development by creating an account on GitHub.
github.com
'Web' 카테고리의 다른 글
[springboot] Spring Security 6.x로 소셜 로그인 구현하기 (oauth2) (1) | 2024.06.08 |
---|---|
[springboot] Spring Security 6.x로 로그인 구현하기 (jwt 인증) (0) | 2024.06.05 |
[springboot] 로그 설정1 (slf4j, logback) - 가장 쉽게 mybatis 쿼리 출력하기 (1) | 2024.06.03 |
Springboot Security는 어떤 역할을 할까? (0) | 2024.06.01 |
[springboot] DB연결하기 - local MySQL+MyBatis (프로젝트 구조, 환경변수 설정, 연결확인) (0) | 2024.06.01 |