이 글은 인프런 정수원님의 강의를 복습하며 작성한 글입니다.
Spring Security : 계정 생성 + 권한 설정 + 인증/인가 설정
Spring Security는 기본적으로 인증 / 인가를 바탕으로 동작한다. 인증/인가를 위해서 필요한 것은 바로 계정이고, 그 계정에 어떤 권한이 설정되는지가 중요하다. 그리고 어떤 자원으로 접근할 때 인증이 필요한지, 그리고 어떤 권한이 필요한지를 설정하는 것이 Spring Security의 시작이다. 이번 포스팅에서는 계정 생성 + 권한 설정 / 인증 + 인가 설정에 대해 간략히 살펴본다.
Spring Security Config 정보 설정
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {}
Spring Security Config 정보는 WebSecurityConfigurerAdatper 클래스를 상속받은 클래스를 만들어주고, 필요한 메서드를 오버라이딩 해준다. 그리고 @EnableWebSecurity를 붙여주면 된다. 이 때, 필요하면 @Configuration을 등록해서 필요한 스프링 빈을 등록해주기도 한다.
Spring Security 계정 생성 + 권한 설정
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String password = passwordEncoder().encode("1111");
auth.inMemoryAuthentication().withUser("user").password(password).roles("USER");
auth.inMemoryAuthentication().withUser("manager").password(password).roles("MANAGER", "USER");
auth.inMemoryAuthentication().withUser("admin").password(password).roles("ADMIN","MANAGER","USER");
}
Spring Security 계정 설정은 WebSecurityConfigurerAdatper 클래스의 Configurer(Auth) 메서드를 오버라이딩하면서 설정할 수 있다. 이 때 비밀번호는 반드시 passwordEncoder()를 이용해서 복호화해줘야한다.
- auth.inMemoryAuthentication()
- 메모리 상에 존재하는 계정을 만들 수 있다. 서버를 껏다 키면, 이 계정은 새로 만들어지거나 없어진다
- withUser()
- 사용할 계정명을 설정한다.
- password()
- 사용할 비밀번호를 설정한다. 이 때 반드시 passwordEncoder를 이용해서 비밀번호를 복호화해야한다. 그렇지 않으면 Exception이 발생한다.
- roles()
- 계정의 권한을 설정한다.
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
다음은 PasswordEncoder()를 제공해주는 방법이다. PasswordEncoderFactories에서 PasswordEncoder를 만들 수 있다. 그리고 그 결과를 스프링 빈으로 등록해준다. 실제로 현재 상태에서는 딱히 스프링 빈으로 등록할 필요는 없다. @Bean + @Configuration이 없다고 하더라도, 해당 설정 클래스에 메서드가 존재하는 상황이기 때문에 문제 없다.
Spring Security 인증/인가 URL 설정 + 인증 방식 설정
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/mypage").hasRole("USER")
.antMatchers("/messages").hasRole("MANAGER")
.antMatchers("/config").hasRole("ADMIN")
.anyRequest().authenticated();
http
.formLogin();
}
인증 / 인가 정보는 WebSecurityConfigurerAdapter의 configurer(HttpSecurity) 메서드를 오버라이딩하면서 설정할 수 있다.
- authorizeRequests() : URL 인가에 대한 설정을 한다.
- antMatchers() : 접근할 자원의 URL을 설정한다.
- permitAll() : 해당 자원은 어떤 권한이 없어도 접근이 가능하다. 익명 사용자도 접근이 가능하다.
- hasRole() : 특정 권한을 가진 사람만 접근하도록 설정한다.
- anyRequest().authenticated() : 위의 URL을 제외한 모든 자원 접근은 모두 인증처리가 필요하다. 인증된 사용자만 접근 가능하다.
위의 코드로 설정해주면 USER 권한을 가진 사람은 /mypage로 접근이 가능하고, MANAGER 권한을 가진 사람은 /messages로 접근이 가능하다. ADMIN 권한을 가진 사람은 /config로 접근이 가능하다.
테스트코드
https://github.com/chickenchickenlove/spring-security/tree/main/lectureproject/1-1
'Spring > Spring Security' 카테고리의 다른 글
Spring Security : Web Ignore 설정 (0) | 2022.04.09 |
---|---|
Spring Security : 아키텍쳐 / 필터 초기화와 보안 클래스 다중 설정 (0) | 2022.04.06 |
Spring Security : 아키텍쳐(DelegatingFilterProxy, FilterChainProxy) (0) | 2022.04.06 |
Spring Security : CSRF / CSRF Filter (0) | 2022.04.05 |
Spring Security : 선언적 권한 설정과 표현식 (0) | 2022.04.05 |