[Spring Security] Authority Based Authorization - Spring Boot (4)

반응형

이번 글에서는 Spring Boot App에 Authority Based Authorization을 적용하는 방법에 대해 알아보도록 하겠습니다.

1. Authority Based Authorization

이번에는 이전글에서 생성한 spring boot app에 Authority Based Authorization을 적용해보겠습니다.

authority based authorization을 사용하면, role based 보다 세분화하여 사용자들의 접근을 제한할 수 있습니다.

실제로 application을 운영할때에는 대부분 authority base로 authorization을 수행합니다.

간단히 Role은 여러개의 authority가 조합된 덩어리라고 생각할 수 있습니다. 😎

1-1) overall

아래와 같이 SecurityConfiguration를 변경합니다.

SecurityConfiguration

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("admin")
                .password(passwordEncoder().encode("admin123"))
                .roles("ADMIN").authorities("ACCESS_TEST1", "ACCESS_TEST2")
                .and()
                .withUser("user")
                .password(passwordEncoder().encode("user123"))
                .roles("USER")
                .and()
                .withUser("manager")
                .password(passwordEncoder().encode("manager123"))
                .roles("MANAGER").authorities("ACCESS_TEST1");

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                //.anyRequest().authenticated()
                .antMatchers("/index.html").permitAll()
                .antMatchers("/profile/**").authenticated()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/manager/**").hasAnyRole("ADMIN","MANAGER")
                .antMatchers("/api/public/test1").hasAuthority("ACCESS_TEST1")
                .antMatchers("/api/public/test2").hasAuthority("ACCESS_TEST2")
                .and()
                .httpBasic();
    }

    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

이전글에서 달라진부분만 살펴보겠습니다.

1-2) AuthenticationManagerBuilder

configure(AuthenticationManagerBuilder auth)

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .inMemoryAuthentication()
                .withUser("admin")
                .password(passwordEncoder().encode("admin123"))
                .roles("ADMIN").authorities("ACCESS_TEST1", "ACCESS_TEST2")
                .and()
                .withUser("user")
                .password(passwordEncoder().encode("user123"))
                .roles("USER")
                .and()
                .withUser("manager")
                .password(passwordEncoder().encode("manager123"))
                .roles("MANAGER").authorities("ACCESS_TEST1");

}

• authorities( ) : 각 ROLE에 세부 authority를 지정합니다.

1-3) HttpSecurity

configure(HttpSecurity http)

@Override
protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                //.anyRequest().authenticated()
                .antMatchers("/index.html").permitAll()
                .antMatchers("/profile/**").authenticated()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/manager/**").hasAnyRole("ADMIN","MANAGER")
                .antMatchers("/api/public/test1").hasAuthority("ACCESS_TEST1")
                .antMatchers("/api/public/test2").hasAuthority("ACCESS_TEST2")
                .and()
                .httpBasic();
}

• hasAuthority( ) : 해당 location의 resource에는 명시된 authority를 소유한 사용자만 접근할 수 있습니다.

2. Test

이제 어플리케이션을 실행해보겠습니다

2-1) login user

앞서 hasAuthority( )로 "/api/public/test1"은 "ACCESS_TEST1" authority를 소유한 사용자만 접근가능하도록 설정했습니다.

따라서, user로 login 할 경우 위와 같이 접근할 수 없습니다.

2-1) login manager

동일하게 hasAuthority( )로 "/api/public/test2"은 "ACCESS_TEST2" authority를 소유한 사용자만 접근가능하도록 설정했습니다.

따라서, manager로 login 할 경우 위와 같이 접근할 수 없습니다.


참고 자료 : https://www.youtube.com/playlist?list=PLVApX3evDwJ1d0lKKHssPQvzv2Ao3e__Q


추천서적

 

스프링5 레시피:스프링 애플리케이션 개발에 유용한 161가지 문제 해결 기법

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY