728x90
    
    
  - RequestMatcherDelegatingAuthorizationManager의 mappings 속성에 직접 RequestMatcherEntry 객체를 생성하고 추가
 - RequestMatcherEntry<T> 클래스의 메서드
- getEntry() : 요청 패턴에 매핑된 AuthorizationManager 객체를 반환
 - getRequestMatcher() : 요청 패턴을 저장한 RequestMatcher 객체를 반환
 
 

적용
- RequestMatcherDelegatingAuthorizationManager를 감싸는 CustomRequestMatcherDelegatingAuthorizationManager를 구현
 

적용 후 구조

- 가장 바깥쪽에는 access() API 사용 시 기본으로 생성되기 때문에 위와 같은 구조를 가짐
 - 위와 같은 구조는 좋은 구조가 아니지만 원리를 이해하기 위해 위처럼 설정
 
SecurityConfig.java
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
	return http.authorizeHttpRequests(auth -> auth.anyRequest().access(authorizationManager(null))).build();
}
@Bean
public AuthorizationManager<RequestAuthorizationContext> authorizationManager(HandlerMappingIntrospector introspector){
	List<RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>>> mappings = new ArrayList<>();
	
	RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry1 =
		new RequestMatcherEntry<>(new MvcRequestMatcher(introspector, "/user"), AuthorityAuthorizationManager.hasAuthority("ROLE_USER"));
	RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry2 =
		new RequestMatcherEntry<>(new MvcRequestMatcher(introspector, "/admin"), AuthorityAuthorizationManager.hasRole("ADMIN"));
	
	RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> requestMatcherEntry3 =
		new RequestMatcherEntry<>(AnyRequestMatcher.INSTANCE, new AuthenticatedAuthorizationManager<>());
	
	mappings.add(requestMatcherEntry1);
	mappings.add(requestMatcherEntry2);
	mappings.add(requestMatcherEntry3);
	
	return new CustomRequestMatcherDelegatingAuthorizationManager(mappings);
}
- requestMatcherEntry1 ⇒ /user에 접근하기 위해서는 ROLE_USER의 권한을 가져야 함
 - requestMatcherEntry2 ⇒ /admin에 접근하기 위해서는 ROLE_ADMIN의 권한을 가져야 함
 - requestMatcherEntry3 ⇒ 그 외의 모든 접근(AnyRequestMatcher.INSTANCE)에는 인증을 해야 함
 
CustomRequestMatcherDelegatingAuthorizationManager
public class CustomRequestMatcherDelegatingAuthorizationManager implements AuthorizationManager<RequestAuthorizationContext> {
	private final RequestMatcherDelegatingAuthorizationManager manager;
	
	public CustomRequestMatcherDelegatingAuthorizationManager(List<RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>>> mappings) {
		Assert.notEmpty(mappings, "mappings cannot be empty");
		manager = RequestMatcherDelegatingAuthorizationManager.builder().mappings(maps -> maps.addAll(mappings)).build();
	}
	
	@Override
	public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext object) {
		return manager.check(authentication,object.getRequest());
	}
	
	@Override
	public void verify(Supplier<Authentication> authentication, RequestAuthorizationContext object) {
		AuthorizationManager.super.verify(authentication, object);
	}
}
- 요청에 대한 권한 검사를 RequestMatcherDelegatingAuthorizationManager 객체가 수행하도록 함
 - RequestMatcherDelegatingAuthorizationManager → CustomRequestMatcherDelegatingAuthorizationManager 
→ RequestMatcherDelegatingAuthorizationManager 구조는 좋은 구조가 아니기 때문에 개선이 필요 
728x90
    
    
  'Language > Spring Security' 카테고리의 다른 글
| 메서드 기반 Custom AuthorizationManager 구현 (0) | 2024.08.02 | 
|---|---|
| 메서드 기반 인가 관리자 - PreAuthorizeAuthorizationManager 외 클래스 구조 이해 (0) | 2024.08.01 | 
| 요청 기반 Custom AuthorizationManager 구현 (0) | 2024.08.01 | 
| 요청 기반 인가 관리자 - AuthorityAuthorizationManager 외 클래스 구조 이해 (0) | 2024.08.01 | 
| 인가 관리자 이해 - AuthorizationManager (0) | 2024.08.01 |