반응형
오늘은 Spring Security를 데이터베이스와 연동하여 사용자 인증 및 권한 관리를 구현하는 방법을 학습합니다. 이전에는 In-Memory 인증을 사용했지만, 실제 프로젝트에서는 사용자 정보를 데이터베이스에 저장하고 이를 기반으로 인증하는 경우가 일반적입니다.
1. 데이터베이스 설정
먼저, 사용자 정보를 저장할 데이터베이스 테이블을 설계합니다.
(1) 사용자 테이블 설계
CREATE TABLE users (
username VARCHAR(50) NOT NULL PRIMARY KEY,
password VARCHAR(100) NOT NULL,
enabled BOOLEAN NOT NULL
);
CREATE TABLE authorities (
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL,
FOREIGN KEY (username) REFERENCES users(username)
);
- users: 사용자 계정 정보를 저장합니다.
- authorities: 사용자 권한 정보를 저장합니다.
2. 예제 데이터 삽입
테스트 데이터를 삽입합니다.
INSERT INTO users (username, password, enabled) VALUES
('admin', '$2a$10$e1NrKZy/l4Jhtd89KVGjOuwBr.jE24OvTHjxMvHk8XK.tFbVOO.aS', true), -- 비밀번호: admin123
('user', '$2a$10$e1NrKZy/l4Jhtd89KVGjOuwBr.jE24OvTHjxMvHk8XK.tFbVOO.aS', true); -- 비밀번호: user123
INSERT INTO authorities (username, authority) VALUES
('admin', 'ROLE_ADMIN'),
('user', 'ROLE_USER');
비밀번호는 BCrypt로 암호화되었습니다. 이후 Spring에서 자동으로 비교 처리합니다.
3. Spring Security 설정
(1) 의존성 추가
pom.xml에 Spring Data JPA와 H2 데이터베이스를 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
(2) application.properties 파일 설정
H2 데이터베이스를 설정합니다.
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
4. UserDetailsService 구현
Spring Security는 사용자 정보를 제공하기 위해 UserDetailsService를 사용합니다. 이를 커스터마이즈하여 데이터베이스에서 사용자 정보를 로드합니다.
(1) UserDetailsService 구현
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import javax.sql.DataSource;
@Configuration
public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService(DataSource dataSource) {
return new JdbcUserDetailsManager(dataSource);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- JdbcUserDetailsManager: Spring Security에서 기본 제공하는 JDBC 기반 구현체로, 사용자 정보를 데이터베이스에서 로드합니다.
- PasswordEncoder: BCrypt를 사용해 암호화를 처리합니다.
(2) JDBC 기본 쿼리
Spring Security는 기본적으로 다음 쿼리를 사용합니다:
- 사용자 인증:
SELECT username, password, enabled FROM users WHERE username = ?;
- 권한 조회:
SELECT username, authority FROM authorities WHERE username = ?;
5. 로그인 테스트
- 애플리케이션 실행 후 /login 페이지로 이동합니다.
- 다음 계정으로 로그인합니다:
- 관리자 계정:
- 아이디: admin
- 비밀번호: admin123
- 사용자 계정:
- 아이디: user
- 비밀번호: user123
- 관리자 계정:
- 로그인 성공 후, /admin 또는 /user 경로로 이동하여 권한에 따라 접근 가능 여부를 테스트합니다.
6. 추가적인 작업
- Custom Query: 기본 쿼리를 커스터마이즈하려면 JdbcUserDetailsManager의 메서드를 오버라이드합니다.
- Custom Table: 사용자 정보와 권한 테이블 이름을 변경하려면 SQL을 수정합니다.
- Role Hierarchy: 권한 계층을 정의하여 관리자의 권한을 자동으로 상속되게 설정할 수 있습니다.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
MyBatis를 사용한 Oracle 데이터 페이징 처리 (0) | 2024.12.31 |
---|---|
Spring Security 커스터마이징 (Custom UserDetailsService 구현) (0) | 2024.12.30 |
Spring Security를 활용한 인증 및 권한 관리 기초 (0) | 2024.12.30 |
RESTful API와 Spring Boot의 REST 컨트롤러 설계하기 (0) | 2024.12.30 |
Spring Boot에서 Pagination(페이징)과 Sorting(정렬) 구현하기 (0) | 2024.12.29 |