본문 바로가기

Spring Boot

[Spring Security] Run-As로 임시 권한 부여하기

728x90

Spring Security에는 Run-As라는 임시 권한을 부여하는 기능이 있습니다.

이 기능을 통해 User에게 임시적으로 특정 권한을 부여해 여러 가지 작업을 할 수 있게 해 줍니다.

 

임시로 부여한 권한은 일시적으로 부여되는 휘발성 권한이므로 계속 유지되지 않습니다.

 

RunAsManager

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class RunAsConfig extends GlobalMethodSecurityConfiguration {

  @Override
  protected RunAsManager runAsManager() {
    RunAsManagerImpl runAsManager = new RunAsManagerImpl();
    runAsManager.setKey("MyKey");
    return runAsManager;
  }
}

 

클래스 생성 후 GlobalMethodSecurity 설정해 주고 RunAsManager를 Override 해주고 key 값을 지정해줍니다.

 

RunAsImplAuthenticationProvider

public class SecurityConfig {
 ....
 
  @Bean
  public AuthenticationProvider runAsAuthenticationProvider() {
    RunAsImplAuthenticationProvider authProvider = new RunAsImplAuthenticationProvider();
    authProvider.setKey("MyKey");
    return authProvider;
  }
 ....
 
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    ....
    auth.authenticationProvider(runAsAuthenticationProvider());
  }
}

 

RunAsImplAuthenticationProvider에 같은 key 값을 지정해 주고 provider로 적용시킵니다.

후에 Provider로 제공된 key와 runasmanager의 key를 비교하여 검증하게 됩니다.

 

사용하기

@Secured({"ROLE_USER", "RUN_AS_SPECIAL_USER"})
@PostMapping("/runas")
public String runas() {
  return "";
}

 

컨트롤러의 Secured 안에 RUN_AS_ 접두어를 가진 ROLE을 추가한 후, 컨트롤러에 진입하게 되면 ROLE_RUN_AS_라는 권한이 User에게 추가된다.

 

위의 코드에서는 RUN_AS_SPECIAL_USER 가 Secured에 추가되어 있고, 해당 컨트롤러에 들어오면 User에 ROLE_RUN_AS_SPECIAL_USER 권한이 추가됩니다.

 

이 임시 권한은 해당 컨트롤러 안에서만 유효하며 컨트롤러에서 나가면 사라집니다.

 

- 컨트롤러 진입 전

 

- 컨트롤러 진입 후

 

권한 이용하기

 

  @Secured({"ROLE_RUN_AS_SPECIAL_USER"})
  public Authentication getAuth() {
    return SecurityContextHolder.getContext().getAuthentication();
  }

 

임시 권한으로만 작동하는 메서드를 만든 후 컨트롤러에서 이를 사용할 수 있습니다.

 

@Secured({"ROLE_USER", "RUN_AS_SPECIAL_USER"})
@PostMapping("/runas")
public String runas() {
  서비스.getUser();
  return "";
}

 

마무리

가장 최소한의 권한을 가지고 있는 User가 어떤 중요한 데이터의 열람을 해야 할 때나, 

특정한 User에게 링크를 건네고 그 링크 내에서만 주요한 작업을 허용할 때 등 새로 권한을 만들어서 추가해주는 것보다 경제적으로 사용될 것 같습니다.

 

 

 


박준호 / 선임연구원

Junho Park / 서비스R&D팀

 

 

junho@userinsight.co.kr

728x90