여러명의 사용자 추가하는 방법
앞서 우리는 한명의 user만이 해당 어플리케이션을 이용할 수 있었다. 해당 어플리케이션을 사용하고자
하는 사람이 한명의 user id와 password를 알지 못하면 해당 어플리케이션을 접속할 수 없었다. 따라서
이번시간에는 여러명의 유저를 추가하는 방법에 대해서 알아보고자 한다.
앞서 인증에 대한 함수의 기본 골격에 대해서 살펴보았다. 여러명의 사용자를 추가하기 위해선 우리는
다른 객체를 DI하고 있는 configure 함수를 추가해서 오버라이딩해야한다.
@Configuration
public class ProjectSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeReuqests().anyRequest()
.authenticated().and().forLogin()
.and().httpBasic();
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("a").authorities("admin")
.and().withUser("user").password("u").authorities("read")
.and().passwordEncoder(NoOpPasswordEncoder.getInstance());
}
}
해당 configure 함수는 AuthenticationManagerBuilder를 객체로 받고 있다. 해당 객체에는
inMemoryAuthenticatioin() 함수가 있는데 해당 함수는 추가되는 user를 Spring Container
에 저장하는 역할을 담당한다.
또 보면은 withUser().password().authorities() 함수를 통해 사용자, 패스워드, 권한을 추
가해 줄 수 있고 and()를 통해 또다른 사용자를 추가해 줄 수 있다.
그리고 기본적으로 추가하고 싶은 user를 다 추가한 후 passwordEncoder() 함수를 통해 마무리
지어주어야한다. Encoder 방식의 설정을 해주지 않을 경우 Spring Security가 에러를 발생시킨
다. 현재는 Encoder 설정을 해주지 않았고 차후에 Encoder 설정을 하기로 하자.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();
UserDetails user = User.withUsername("admin").password("a").authorities("admin").build();
UserDetails user1 = User.withUsername("user").password("u").authorities("read").build();
userDetailsService.createUser(user);
userDetailsService.createUser(user1);
auth.userDetailsService(userDetailsService);
}
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
위 코드는 위에서 살펴본 protected void configure(AuthenticationManagerBuilder auth)와 같은 로
직의 코드이지만 조금더 직관적으로 이해하기 위해 넣게되었다.
해당 코드를 살펴보면 알수 있듯이 userDetailsService를 이용해 createUser() 메소드를 통하여 생성한
User에 대해 추가해 주었고. 그 userDetailsService를 auth 객체에 있는 method의 매개변수에 넣어줌
으로써 Spring Security를 구성해주었다.
그리고 인코더 부문과 관련해선 Bean 객체로 등록해주었다.
inMemoryAuthentication() 과 InMemoryUserDetailsManager()의 차이
두 메서드 사용자를 추가하는 기능이 있다. 후자(InMemoryUserDetailsManage())의 경우 user를 삭제하
고 업데이트할 수 있는 함수가 있는 반먼 전자(inMemoryAuthentication())의 경우 사용자를 생성하는 메
서드만 사용할 수 있는 차이점이 있다.
간편하게 사용자를 추가하는 코드를 작성하고자 할 때 전자를 쓰고 그렇지 않고 삭제 및 수정을 할 필요성
이 있을 경우 후자를 사용하면 될 것 같다.
그래서 접속은?
위와 같이 admin 권한을 가진 사용자와 user 권한을 가진 사용자를 추가해주었다. 그랬을 때 application
.properties에 설정한 user로는 접근할 수 없고 우리가 설정해준 사용자를 통해서만 접속할 수 있다.
