작성
·
263
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
프로그래밍 방식에서 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 인턴입니다.
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
인스턴스들을 리스트에 추가하고, 해당 리스트를 사용하여 권한 검사 로직에 적용하면 권한 동적 적용 과정을 완성할 수 있습니다.
이와 같은 방식으로 권한 설정을 동적으로 구성할 수 있으며, 구체적인 구현 방법은 응용 프로그램의 요구 사항과 환경에 따라 달라질 수 있습니다. 문제 해결에 도움이 되었기를 바랍니다!