Spring Security
스프링 시큐리티는 어떤 데이터 저장소에 대해서도 가상으로 사용자 인증이 가능하다.
몇 가지 일반적인 사용자 저장 방식인 인메모리, 관계형 데이터베이스, LDAP에 기능을 제공하고, 사용자 저장에 대한 구현을 새롭게 만들어 사용할 수도 있다.
📌 build.gradle
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security
implementation 'org.springframework.boot:spring-boot-starter-security:2.6.7'
📌 application.yml
spring:
security:
user:
name: [username]
password: [password]
1. 인메모리 사용자 저장소로 작업하기
인메모리 사용자 저장소가 디버깅이나 개발 테스트 목적으로만 유용하다.
WebSeurityConfigurerAdapter를 확장하여 보안 설정을 했으므로 가장 쉽게 사용자 저장소를 설정하는 방법은 AuthenticationManagerBuilder를 인자로 갖는 configure() 메서드를 오버라이딩하는 것이다.
AuthenticationManagerBuilder는 스프링 시큐리티의 인증에 대한 지원을 설정하는 몇 가지 메서드를 가지고 있다.
inMemoryAuthentication() 메서드로 활성화 및 설정이 가능하고 선택적으로 인메모리 사용자 저장소에 값을 채울 수 있다.
withUser()는 UserDetailsManagerConfigurer.UserDetailBuilder를 반환하고, 이는 사용자 암호를 설정하는 password()와 사용자에게 권한에 대한 역할을 부여해 주는 roles()를 포함한 몇 가지 사용자 설정 메서드를 제공한다.
password(), roles(), and() 뿐만 아니라 인메모리 사용자 저장소에서 사용자 상세 정보를 설정하기 위한 메서드가 몇 가지 더 있다.
UserDetailsManagerConfigurer.UserDetailBuilder에 사용가능한 모든 메서드가 정리되어 있다.
메서드 | 설명 |
accountExpired(boolean) | 계정이 만료되었는지 아닌지를 정의 |
accountLocked(boolean) | 계정이 잠겨 있는지 아닌지를 정의 |
and() | 설정을 연결하기 위해 사용 |
authorities(GrantedAuthority...) | 사용자에게 부여된 권한들을 명시 |
authorities(List<? extends GrantedAuthority>) |
사용자에게 부여된 권한들을 명시 |
authorities(String...) | 사용자에게 부여된 권한들을 명시 |
credentialsExpired(boolean) | 자격이 만료되었는지 아닌지를 정의 |
disabled(boolean) | 계정이 비활성화되었는지 아닌지를 정의 |
password(String) | 사용자의 암호를 명시 |
roles(String...) | 사용자에게 부여된 역할을 명시 |
authorities() 메소드의 축약으로 roles() 메소드가 사용된다
roles()의 인자로 사용된 값들에 ROLE_ 접두사를 붙여서 사용자에게 권한으로 부여해 줄 수 있다.
📌 SecurityConfig
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("이름이름").password("{noop}test1234").roles("USER").and()
.withUser("admin").password("test1212").authorities("ROLE_USER", "ROLE_ADMIN");
}
}
plain text를 사용하면 오류가 발생할 수 있으니 이 값을 인코딩 없이 사용할 수 있도록 {noop} 값을 부여. 어떠한 인코딩 없이 사용할 것을 의미.
2. 데이터베이스 테이블로 인증하기
스프링 시큐리티에서 JDBC 지원 사용자 저장소에서 인증하기 위해 jdbcAuthentication() 메서드를 사용한다.
📌 SecurityConfig
@Configuration
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final DataSource dataSource;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication()
.dataSource(dataSource);
}
}
DataSource만 설정해 주면 관계형 데이터에 접근이 가능해진다.
👀 참고자료
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kimnx9006&logNo=220634017538
'[ Spring ] > REST API' 카테고리의 다른 글
[Spring] REST API 규격 정하기 (0) | 2022.05.15 |
---|---|
[Spring] HAL Explorer를 이용한 Hateoas 기능 구현 (0) | 2022.05.11 |
[Spring] Rest Api Monitoring을 위한 Actuator 설정 (0) | 2022.05.11 |
[Spring] Rest API Documentation을 위한 Swagger 사용 (0) | 2022.05.10 |
[Spring] API 구현을 위한 Hateoas 적용 (0) | 2022.05.10 |