이전 글에서는 자바 스프링 프레임워크를 이용해 ERP 시스템의 기본적인 구조와 사용자 관리 기능을 구현했습니다. 이번 글에서는 사용자 인증과 권한 관리 기능을 추가하여 시스템의 보안을 강화하는 방법을 다룹니다. 이는 ERP 시스템 구축에서 중요한 단계로, 각 사용자의 역할에 맞게 적절한 권한을 부여하고 관리할 수 있어야 합니다.
1. 사용자 인증 시스템 구축
사용자 인증은 ERP 시스템 보안의 핵심입니다. 이번 섹션에서는 Spring Security를 사용하여 로그인 및 인증 기능을 구현하겠습니다.
1.1 Spring Security 설정 추가
우선, Spring Security 의존성을 추가합니다. pom.xml 파일에 다음을 추가하세요.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
1.2 기본적인 보안 설정
스프링 부트에서 제공하는 기본 보안 설정은 모든 경로를 보호하며, 기본 로그인 페이지를 제공합니다. 이를 커스터마이징하기 위해 SecurityConfig 클래스를 생성하여 설정을 수정할 수 있습니다.
java
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;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login", "/resources/**").permitAll() // 로그인 페이지는 허용
.anyRequest().authenticated() // 나머지 요청은 인증 필요
.and()
.formLogin()
.loginPage("/login") // 커스텀 로그인 페이지 설정
.defaultSuccessUrl("/dashboard", true) // 로그인 성공 시 이동할 페이지
.permitAll()
.and()
.logout()
.permitAll();
}
}
위 설정에서는 /login
경로로 사용자 로그인 페이지를 제공하며, 로그인 성공 시 /dashboard
로 이동하도록 설정했습니다.
1.3 사용자 엔티티에 보안 정보 추가
로그인을 위해 사용자 정보에 권한(Role)을 추가해야 합니다. 사용자 테이블에 역할 정보를 추가해봅시다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ElementCollection(fetch = FetchType.EAGER)
private Set<String> roles = new HashSet<>();
// getter, setter 추가
}
1.4 사용자 인증 로직 구현
이제 UserDetailsService를 이용해 사용자 인증 로직을 구현합니다.
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class MyUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
public MyUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
return org.springframework.security.core.userdetails.User
.withUsername(user.getUsername())
.password(user.getPassword())
.roles(user.getRoles().toArray(new String[0]))
.build();
}
}
위 코드는 사용자가 로그인할 때 DB에서 사용자 정보를 조회하여 인증하는 역할을 수행합니다.
2. 사용자 권한 관리
이제 사용자 권한을 관리하는 기능을 추가하겠습니다. 권한(Role)을 통해 관리자는 모든 기능을 사용할 수 있지만, 일반 사용자는 제한된 기능만 사용하게 설정할 수 있습니다.
2.1 권한에 따른 접근 제한
스프링 시큐리티에서는 간단하게 권한을 기반으로 접근을 제한할 수 있습니다. SecurityConfig
에 다음과 같은 코드를 추가해보세요.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // 관리자만 접근 가능
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN") // 사용자 및 관리자 접근 가능
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
위 코드는 /admin
으로 시작하는 경로는 관리자만 접근할 수 있게 설정하고, /user
경로는 일반 사용자와 관리자 모두 접근할 수 있게 설정한 예시입니다.
2.2 관리자 페이지 구현
이제 관리자를 위한 관리자 페이지를 만들어, 사용자를 관리하고 시스템 설정을 제어할 수 있는 기능을 추가해보겠습니다.
@Controller
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/dashboard")
public String adminDashboard() {
return "admin-dashboard"; // 관리자 대시보드 뷰로 이동
}
@GetMapping("/users")
public String manageUsers(Model model) {
// 사용자 목록을 가져와 뷰에 전달
List<User> users = userRepository.findAll();
model.addAttribute("users", users);
return "manage-users";
}
}
관리자 페이지에서는 사용자를 관리하고, 시스템 전반의 설정을 조정할 수 있는 기능들을 추가해 나갈 수 있습니다.
결론
이번 글에서는 Spring Security를 사용해 사용자 인증과 권한 관리를 구현하는 방법을 살펴보았습니다. ERP 시스템은 보안이 중요한 만큼, 적절한 인증과 권한 관리를 통해 각 사용자의 역할에 맞는 접근 권한을 부여하는 것이 필수적입니다. 앞으로 진행될 단계에서는 더 복잡한 권한 시스템과 감사 로그 기능 등을 추가하여 ERP 시스템의 완성도를 높여갈 예정입니다.
다음 글에서는 ERP 시스템의 주요 기능 중 하나인 재고 관리 모듈을 구축하는 방법을 다루겠습니다.