이번 글에서는 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
추천서적
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Spring > Security' 카테고리의 다른 글
[Spring Security] Database Authentication - Spring Boot (6) (0) | 2020.09.08 |
---|---|
[Spring Security] Enable SSL/HTTPS - Spring Boot (5) (0) | 2020.09.08 |
[Spring Security] Role Based Authorization - Spring Boot (3) (0) | 2020.09.08 |
[Spring Security] HTTP Basic Authentication - Spring Boot (2) (0) | 2020.09.08 |
[Spring Security] Default Configuration - Spring Boot (1) (0) | 2020.09.08 |