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팀
'Spring Boot' 카테고리의 다른 글
[JPA] Entity Column에 Map 사용하기 (0) | 2022.10.06 |
---|---|
[Spring Security] Multi Tenancy 환경에 Remember Me 적용하기 (0) | 2022.10.05 |
hikariCP 커넥션 누수 탐지 및 QueryDsl의 transform 커넥션 누수 이슈 해결 (0) | 2022.08.12 |
[Spring Boot] Optional의 orElse(), orElseGet() 알고 쓰기 (0) | 2022.08.11 |
[Spring Boot] WebSecurityConfigurerAdapter Deprecated 대처 (1) | 2022.08.10 |