인프런 커뮤니티 질문&답변

aanicall님의 프로필 이미지

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

WebFlux 방식에서 권한 동적 적용하려고 하는데 잘 안됩니다.

24.06.01 01:30 작성

·

219

0

안녕하세요.

강사님 강의 듣고 WebFlux 방식에서도 프로그래밍 방식 또는 동적방식으로 권한을 적용해 보고자 이것저것 해보고 있는데요.

WebFlux 방식에서는 DelegatingReactiveAuthorizationManager 클래스에서

private final List<ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>>> mappings;

이 형식으로 mappings를 생성자로 넘겨주거나 생성될때 build add() 메서드로 한건식 넘겨주면 List 형식에 추가되어 요청이 들어오면 아래의 check메서드에서 해당 요청을 체크하는 것 같습니다.

@Override
public Mono<AuthorizationDecision> check(Mono<Authentication> authentication, ServerWebExchange exchange) {
    return Flux.fromIterable(this.mappings)
       .concatMap((mapping) -> mapping.getMatcher()
          .matches(exchange)
          .filter(MatchResult::isMatch)
          .map(MatchResult::getVariables)
          .flatMap((variables) -> {
             logger.debug(LogMessage.of(() -> "Checking authorization on '"
                   + exchange.getRequest().getPath().pathWithinApplication() + "' using "
                   + mapping.getEntry()));
             return mapping.getEntry().check(authentication, new AuthorizationContext(exchange, variables));
          }))
       .next()
       .defaultIfEmpty(new AuthorizationDecision(false));
}

문제는 mappings 정보를 어떻게 만들어서 넘겨야 할지 감이 안옵니다.

.pathMatchers(HttpMethod.GET, "/routes").permitAll()
.pathMatchers(HttpMethod.POST, "/auth-server/**").permitAll()
.pathMatchers(HttpMethod.POST,"/auth-service/auth/token").permitAll()
.pathMatchers(HttpMethod.GET,"/auth-service/api/v1/users").hasRole("ROLE_USER")

이 4개의 pathMatchers를 아래의 형식으로 해서 List로 넘겨야 할듯 한데 어떻게 할 수 있을까요?

ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>>>

 

new ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>>(
        ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/auth-service/api/v1/users"),
        AuthorityReactiveAuthorizationManager.hasRole("ROLE_USER"))

위의 방법으로 객체를 하나하나 만들어서 넘겨보기도 했는데 Role이 지정된 건 적용이 됩니다.

그러나 permitAll()을 시켜줘야 하는 것들은 어떻게 적용시켜야 할지...

하루종일 방법을 찾아봤는데 내공 부족으로 인하여 못찾고 해매고 있습니다.

도움 부탁드립니다.

 

 

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

2024. 06. 05. 16:05

프로그래밍 방식에서 permitAll 을 처리하는 부분도 강의에서 설명하고 있습니다.

permitAll 은 표현식이기 때문에 WebExpressionAuthorizationManager 를 사용해야 합니다.

webflux 에서 표현식을 처리하는 다른 클래스가 존재하는지는 확인해 봐야겠지만 일단 new WebExpressionAuthorizationManager("permitAll") 처럼 되도록 구성해야 합니다.

 

new ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>>( ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/auth-service/api/v1/users"), new WebExpressionAuthorizationManager ("permitAll"))

과 같이 구성이 되어야 할 것 같습니다.

 

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 03. 01:36

안녕하세요, 인프런 AI 인턴입니다.

aanicall님, WebFlux에서 권한 동적 적용 문제로 고민이 많으신 것 같네요. ServerWebExchangeMatcherEntry<ReactiveAuthorizationNanager<AuthorizationContext>>> 형식으로 권한 설정을 동적으로 구성하는 방법에 대해 자세히 알아보겠습니다.

먼저, permitAll()을 처리하는 방법입니다. permitAll()의 경우, ReactiveAuthorizationManager<AuthorizationContext>에서 항상 true를 반환하는 인스턴스를 만들어 사용하면 됩니다. 예를 들면, 아래와 같은 방법으로 처리할 수 있습니다.

ReactiveAuthorizationManager<AuthorizationContext> permitAllManager = (authentication, context) -> Mono.just(new AuthorizationDecision(true));

이제, permitAllManager를 사용해 permitAll에 해당하는 경로를 처리하는 ServerWebExchangeMatcherEntry를 생성할 수 있습니다.

ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>> permitAllEntry = 
    new ServerWebEngineMatcherEnrty<>(
        ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/routes"),
        permitAlManager);

위의 코드를 활용하면, permitAll을 필요로 하는 경로에 대해 쉽게 처리할 수 있습니다.

이와 같은 방식으로, 권한이 필요한 다른 경로들(hasRole, authenticated 등)에 대해서도 적절한 ReactiveAuthorizationManager<AuthorizationContext>를 구현하여 ServerWebExchangeMatcherEntry 리스트에 추가하면 됩니다.

예를 들어, hasRole("ROLE_USER")을 처리하기 위해서는 다음과 같이 AuthorityReactiveAuthorizationManager.hasRole("ROLE_USER")를 사용하여 인스턴스를 생성하고, 이를 ServerWebExchangeMatcherEntry에 전달하면 됩니다.

ServerWebExchangeMatcherEntry<ReactiveAuthorizationManager<AuthorizationContext>> roleUserEntry = 
    new ServerWebExchangeMatcherEntry<>(
        ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/auth-service/api/v1/users"),
        AuthorityReactiveAuthorizationManager.hasRole("ROLE_USER"));

이제 생성한 ServerWebExchangeMatcherEntry 인스턴스들을 리스트에 추가하고, 해당 리스트를 사용하여 권한 검사 로직에 적용하면 권한 동적 적용 과정을 완성할 수 있습니다.

이와 같은 방식으로 권한 설정을 동적으로 구성할 수 있으며, 구체적인 구현 방법은 응용 프로그램의 요구 사항과 환경에 따라 달라질 수 있습니다. 문제 해결에 도움이 되었기를 바랍니다!

aanicall님의 프로필 이미지

작성한 질문수

질문하기