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





