본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


Spring Security

스프링시큐리티 공부 2 - 사용자 추가

반응형

이전 시간에 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()로 그 외 모든 요청에 대해 인증을 요구한다. 

 

반응형