이전 시간에 application.yml 에 사용자를 추가하여 로그인을 해봤다. 테스트를 위해서 여러명을 등록해 두고 싶다면
Security 설정파일인 SecurityConfig에 유저를 설정해 놓을 수 있다.
ackage com.sp.fc.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity(debug = true)
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//등록시 비밀번호를 암호화 하지 않으면 등록이 안된다.
auth.inMemoryAuthentication()
.withUser(User.builder()
.username("ugo2")
.password(passwordEncoder().encode("asdasd1"))
.roles("USER"))
.withUser(User.builder()
.username("ugo3")
.password(passwordEncoder().encode("asdasd1"))
.roles("ADMIN"));
//부모의 메서드이며 local에서 지정된 것을 비활성화 시킴
//super.configure(auth);
}
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
configure를 오버라이드해서 회원을 등록할 수 있다.
오버라이드 하면 super.configure()가 자동으로 지정되는데
아래와 같이 부모의 configure에는 로컬에서 지정한 것들을 disable 시키도록 되어있으니
지워 주는 것이 좋다.
inmemoryAuthentication 은 등록한 유저를 메모리에서 관리한다. ugo2 (USER) , ugo3 (ADMIN) 두명을 등록했다.
등록 되었는지 role에 따라 접근 권한이 잘 지정되었는지 ugo2 ugo3이 잘 등록된 것을 알 수 있다.
AuthenticationProvider를 추가하게되면 application.yml의 설정은 먹히지 않는기 떄문에 맨 처음에 등록했던 ugo는 등록되지 않았다.
spring security는 기본적으로 모든 요청에 대해 인증을 요구하기 때문에 인증이 필요하지 않은 페이지를 등록하기 위해선
HttpSecurity를 파라미터로 받는 configure를 재정의 해줘야한다 .
부모의 configure(HttpSecurity http)를 보면 기본적으로
//super.configure(http);
protected void configure(HttpSecurity http) throws Exception {
this.logger.debug("Using default configure(HttpSecurity). "
+ "If subclassed this will potentially override subclass configure(HttpSecurity).");
http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
http.formLogin();
http.httpBasic();
}
모든 요청에 대해 인증을 요구하는 것으로 되어있는데
인증이 필요하지 않은 특정 요청을 지정할 때 아래와 같이 재정의 할 수 있다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((request)->
request.antMatchers("/").permitAll()
.anyRequest().authenticated()
);
http.formLogin();
http.httpBasic();
//super.configure(http);
}
http에는 http요청 인증 처리에 대한 기능들이 담겨서 온다. authorizeRequsets에서 들어오는 요청에 대하여 antMatchers("/")에 해당하는 url패턴의 경우 모든 권한을 허용하고 있다. 그 뒤로는 .anyRequest().authenticated()로 그 외 모든 요청에 대해 인증을 요구한다.
'Spring Security' 카테고리의 다른 글
스프링시큐리티 공부 6 - RoleHierarchy, authenticationDetailsSource 설정하기 (1) | 2021.06.29 |
---|---|
스프링시큐리티 공부 5 - form 로그인 1 (0) | 2021.06.29 |
스프링시큐리티 공부 4 - 스프링 시큐리티에서의 로그인 (0) | 2021.06.27 |
스프링시큐리티 공부 3 - 스프링 시큐리티 작동방식 (0) | 2021.06.27 |
스프링시큐리티 공부 1 - 스프링 시큐리티란? (0) | 2021.06.27 |