inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

433

aanicall

작성한 질문수 10

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()을 시켜줘야 하는 것들은 어떻게 적용시켜야 할지...

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

도움 부탁드립니다.

 

 

spring spring-boot spring-security security web-security

답변 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 인턴

안녕하세요, 인프런 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 인스턴스들을 리스트에 추가하고, 해당 리스트를 사용하여 권한 검사 로직에 적용하면 권한 동적 적용 과정을 완성할 수 있습니다.

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

로그아웃-logout()-2 강에서 겟방식 로그아웃 호출 후 화면이동 질문입니다.

0

36

2

단원별 소스코드

0

66

2

CustomAuthenticationProvider 추가 관련 문의

0

78

2

AOP 의존성 명칭 변경

0

77

1

빈 1개 등록 시 다른 해결 방법

0

70

1

@Bean으로 AuthenticationProvider를 등록 시 http.authenticationProvider 함수를 이용해서 추가해줘야되나요?

0

87

2

OIDC의 id token에 담긴 데이터에 대해

0

78

1

loginPage("/loginPage") 질문드립니다.

0

69

1

@EnableWebSecurity

0

148

1

트랜잭션과 롤백

0

100

1

68. 인증 이벤트 - AuthenticationEventPublisher 활용 강좌 음성 문제

0

91

2

AuthenticationManager 사용 방법

0

153

2

HttpSecurity.authorizeHttpRequests() - 2 강의 부분에 대한 질문

0

108

2

spring security 6.3에서는 HttpSecurity가 만들어지기 전 WebSecurity가 먼저 만들어지는게 맞나요??

0

192

1

init(B Builder), configure(B builder) 에 대하여 질문 드립니다.

0

109

2

메타 주석 질문

0

69

1

동시세션제어 기능에서 로그아웃하기

0

153

3

로그인 후, redirect 에서 error

0

141

3

Session 생성 타이밍에 대한 질문

0

86

2

강의 참고 내용을 개발 로그로 작성해도 될지 문의드립니다.

0

135

2

customAuthentication 관련

0

132

2

authenticationManagerBuilder 주입받은거 vs 만든 거

0

114

1

UserDetailsService()에서 UserDetail이 아닌 타입을 반환할 수 있나요?

0

101

1

9:28 패턴 3의 경우 마지막으로 설정한 것만 적용되는 것 같습니다.

0

162

2