반응형
설정에 대한 설명보다는 기능 중점으로 설명을 하기 위해 Spring Boot를 활용하여 간단한 예제를 작성해보도록 하겠습니다. Token 방식을 활용한 것이 아닌 기본 Session 방식을 이용하여 Spring Security를 구현한 예제입니다.
추후에 Token 방식을 활용한 예제를 포스팅하도록 하겠습니다.
의존성 설정
dependencies {
// Spring Security
implementation 'org.springframework.boot:spring-boot-starter-security'
}
보안 구성 파일 작성: WebSecurityConfig.java
`WebSecurityConfigurerAdapter`를 상속하고 `@EnableWebSecurity` 어노테이션으로 활성화합니다.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
// 정적 자원에 대해서는 Security 설정을 적용하지 않음.
@Override
public void configure(WebSecurity web) {
web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations());
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // /admin 접근은 ROLE_ADMIN 권한 필요
.antMatchers("/user/**").hasAnyRole("ADMIN", "USER") // /user 접근은 ROLE_ADMIN | ROLE_USER 권한 필요
.anyRequest().authenticated() // 나머지 요청은 로그인 요구함
.and()
.formLogin() // 로그인하는 경우
.loginPage("/loginForm")
.successForwardUrl("/main")
.failure(forwardUrl("/loginForm")
.permitAll()
.and()
.logout()
.permitAll()
.and()
.csrf().disable();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- `configure(AuthenticationManagerBuilder auth)`: 사용자 인증을 구성합니다.
- `configure(HttpSecurity http)`: URL 경로별로 접근 제한 규칙을 설정
UserDetails
Spring Security는 사용자 정보(User)를 UserDetails 인터페이스를 구현하여 사용합니다.
아래 코드는 User Entity를 따로 만든 경우의 코드 예제입니다.
public class CustomUserDetails implements UserDetails {
private User user;
private List<GrantedAuthority> authorities;
public CustomUserDetails(User user, List<GrantedAuthority> authorities) {
this.user = user;
this.authorities = authorities;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return user.isEnabled();
}
}
`GrantedAuthority`이란?
Spring Security에서 사용자의 권한을 나타내는 인터페이스입니다. 보통 인증된 사용자에게 할당된 권한 정보를 담고 있습니다. `GrantedAuthority`는 보통 문자열 형태로 권한을 나타내며, 사용자의 역할(Role)이나 권한(Authority)을 나타냅니다.
(ex. 'ROLE_USER', 'ROLE_ADMIN')
User Entity
@Entity
@Table(name = "users")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true)
private String username;
private String password;
private boolean enabled;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles;
}
커스텀 UserDetailsService
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
List<GrantedAuthority> authorities = getUserAuthorities(user.getRoles());
return new CustomUserDetails(user, authorities);
}
private List<GrantedAuthority> getUserAuthorities(List<Role> roles) {
List<GrantedAuthority> authorities = new ArrayList<>();
for (Role role : roles) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return authorities;
}
}
정확한 코드와 설명은 추후에 학습 후 다시 작성하도록 하겠습니다.
반응형
'Spring Security' 카테고리의 다른 글
WebSecurityConfigurerAdapter Deprecated (0) | 2022.10.14 |
---|---|
Spring Security 프로젝트 시작 (0) | 2022.10.14 |
Spring Security @PreAuthorize, @PostAuthorize, @Secured (0) | 2022.10.02 |
Spring Security 스프링 시큐리티 이해하기 (0) | 2022.09.29 |
Spring Security 스프링 시큐리티 설정 (0) | 2022.09.09 |