Spring Security 권한 검증
https://blog.gaoyuexiang.cn/2020/06/13/spring-security-authorization/ ,
내용 에 차이 가 없다.
앞의 글 에서 우 리 는 Spring Security 가 권한 검증 을 하 는 구성 요소 에 대해 대체적으로 알 고 있 습 니 다. 우 리 는 먼저 세부 사항 을 되 돌아 보고 탐구 합 니 다.
FilterSecurityInterceptor
이것 은
AbstractSecurityInterceptor 의 하위 클래스 이 며 Filter 인 터 페 이 스 를 실현 하여 부모 클래스 beforeInvocation(), afterInvocatio() 와 finallyInvocation() 방법 및 일부 Servlet 관련 업 무 를 수행 합 니 다.권한 검증 을 진정 으로 처리 하 는 코드 는 부모 클래스 에 있 습 니 다.그것 이 존재 하 는 의 미 는 Filter 에서 권한 검증 을 할 수 있 도록 하 는 것 이다.이
Filter 기본 값 은 항상 SecurityFilterChain 의 마지막 에 배정 된다. 모든 신분 인증 과 관련 된 Filter 이후 에 보장 해 야 하기 때문이다.AbstractSecurityInterceptor
이 종 류 는 진정한 권한 검증 의 논 리 를 실현 했다. 이 종 류 는 여러 개의 하위 클래스 가 있 는데 서로 다른 기술 에 적합 하기 위해 존재 한다. 예 를 들 어 위의
FilterSecurityInterceptor 은 Servlet Filter 에 적합 하기 위해 존재 한다.우 리 는 위 에서 언급 한 세 가지 방법 을 주목 할 수 있다. 이것 은 모든 하위 클래스 가 호출 할 것 이다.
하위 클래스 의 실현 은 항상 아래 의 방법 입 니 다.
InterceptorStatusToken token = super.beforeInvocation(secureObject); // 1
try {
// call target method, eg, filterChain.doFilter()
// may get a returnedObject
} final {
super.finallyInvocation(token);
}
super.afterInvocation(token, returnedObject); secureObject 는 하나의 방법 으로 호출 되 는데 그 유형 은 Object 이지 만 보통 MethodInvocation 또는 FilterInvocation 이런 유형 을 볼 수 있다.beforeInfocation 방법
이 방법의 목 표 는 호출
AccessDecisionManager.decide() 방법 으로 pre - invocation handling 작업 을 완성 하 는 것 이다.앞의 개관 에서 소 개 했 듯 이
AccessDecisionManager.decide() 방법 은 세 개의 매개 변수 가 있다.그 중 secureObject 는 이미 하위 클래스 로 들 어 왔 습 니 다.그러면 실제 호출 전에 Authentication 대상 과 Collection 집합 을 가 져 와 pre - invocation handling 작업 을 합 니 다.나중에 소개 해 드릴 게 요.
ConfigAttribute 호출 시
AccessDecisionException 가 나타 나 면 그 는 ExceptionTranslationFilter 처 리 될 것 이다.권한 검증 을 통과 하면 반환 값 으로 대상
InterceptorStatusToken 을 준비 합 니 다.token 을 만 들 기 전에
RunAsManager 을 사용 하여 Authentication 대상 을 만 들 려 고 시도 합 니 다. 이 대상 이 null 가 아니라면 SecurityContext 에 있 는 것 을 하나 SecurityContextHolder 넣 고 교체 합 니 다.원래 있 던
SecurityContext 은 항상 token 에 들 어 갑 니 다.... 에 대하 여
RunAsManager: 여기 논 리 는 바 꾸 는 거 예요.SecurityContextHolder 의 값 을 목표 방법 에서 볼 수 있 습 니 다.Authentication 대상 이 이거 예요.RunAsManager 생 성 된 대상 입 니 다.목표 방법 호출 완료 후, 즉finally Invocation 방법 에서 원래 의
SecurityContext 다시 넣 기SecurityContextHolder 중.이러한 목적 은 인증 과 감 권 절차 중의
Authentication 대상 과 업무 방법 중의 구분 을 위 한 것 이다.위의 이러한 절차 에서 일부
ApplicationEvent 를 보 낼 수 있 는데 PublicInvocationEvent, AuthorizationFailureEvent 와 AuthorizedEvent 를 포함한다.PublicInvocationEvent 오직Collection 비어 있 을 때 만 발생 하고 이 럴 때 는 호출 되 지 않 습 니 다.AccessDecisionManager 。 after Infocation 방법
afterInvocation 방법의 주요 목적 은 returnedObject 에 따라 권한 검증 을 하기 위 한 것 이다. 이것 은 AfterInvocationManager 이 인터페이스 에 사용 되 었 다. 이것 은 개관 에서 언급 되 지 않 은 것 으로 after invocation handling 을 하 는 데 사용 된다.이 방법 에서 필요 하 다 면
AfterInvocationManager.decide() 방법 으로 처리 returnedObject 하여 새로운 결 과 를 얻 었 다 returntedObject.여기 서 필요 한 것 은:
afterInvocationManager 필드 가 비어 있 지 않 음 이 방법 은 수신
InterceptorStatusToken 을 매개 변수 로 한 가지 만 합 니 다. token 의 SecurityContext 대상 을 다시 SecurityContextHolder 에 넣 습 니 다.이 조작 은 두 가지 판단 조건 이 있다.
contextHolderRefreshRequired 는 true 이다.SecurityContextHolder 의 값 이 beforeInvocation 에서 바 뀌 었 을 때 이 값 은 true 권한 검증 의 입구
FilterSecurityInterceptor 에 대한 소 개 는 여기까지 입 니 다. 다음은 pre - invocation handling 과 afterinvocation handling 의 내용, 즉 AccessDecisionManager 과 AfterInvocationManager 을 살 펴 보 겠 습 니 다.AccessDecisionManager
개관 에서 소 개 했 던 내용 인 데 여기 서 빠르게 되 짚 어 볼 수 있다.
AccessDecisionManager 은 pre - invocation handling 의 입구 입 니 다.그것 의 세 가지 구체 적 인 실현 은 여러 개 AccessDecisionVoter 의 실현 을 호출 한 다음 에 구체 적 으로 실현 되 는 전략 으로 voter 의 결과 에 따라 인증 여 부 를 판단 하 는 방법 을 결정 한다.모든 voter 는 현재 Authentication 대상, secureObject, Collection 에 따라 접근 허용 여 부 를 선택 합 니 다.AccessDecisionManager 의 세 가지 실현 은 바로 voter 결과 에 따라 최종 결 과 를 결정 하 는 세 가지 전략 으로 각각 AffirmativeBased, ConsensusBased 과 UnanimousBased 이다.책략 은 말 그대로 설명 하지 않 는 다.AfterInvocationManager
이전에 after invocation handling 을 말 하지 않 은 부분 은 중요 하지 않다 고 생각 하고 장면 을 많이 사용 하지 않 았 습 니 다 (사실은 자신 이 만 나 지 못 했 습 니 다).지금 말씀 드 리 고 싶 은 것 은
spring-security-acl after invocation handling 의 메커니즘 을 사 용 했 기 때 문 입 니 다.그럼 어떻게 일 하 는 지 보 자.AfterInvocationManager 의 부분 은 새로운 개념 과 관련 되 어 단독으로 한 편 을 쓰 려 고 한다.이 그림 을 통 해 우 리 는
acl 도 하나의 인터페이스 일 뿐 이라는 것 을 분명히 알 수 있다.그것 의 실현 AfterInvocationManager 은 '많은' AfterInvocationProviderManager 을 관리 하여 권한 검증 을 진정 으로 수행 하 는 작업 이다.여기 "많아 요".
AfterInvocationProvider 사실은 네 개 만 이 루어 졌 는데 그 중 세 개 는 모두AfterInvocationProvider 그림 속 의 이 두 개 를 포함한다.나머지 그것
acl 도 사실 authorization 작업 을 제대로 하지 않 고 대리 로 처리 했다 PostInvocationAdviceProvider.이 PostInvocationAuthorizationAdvice 도 PostInvocationAuthorizationAdvice 만 이 루어 졌 다. 즉, ExpressionBasedPostInvocationAdvice 표현 식 을 바탕 으로 authorization 의 실현 이다.위 에서 언급 한 모든 관리자 와 provider 는 권한 검증 을 위 한
SpEL 방법 을 제공 했다.decide 에 비해 이 방법 들 은 하나의 AccessDecisionManager.decide() 매개 변수 가 더 많아 졌 다.이 는 판단 조건 으로 의사 결정 과정 에 참여 해 야 하기 때 문 이기 도 하고 의사 결정 과정 에서 처 리 된 다음 에 새로운 returnedObject 을 처리 한 결과 로 돌아 갈 수 있 기 때문이다.ConfigAttribute
이 종 류 는 보안 설정 을 저장 하 는 데 사 용 됩 니 다.
예 를 들 어 아래 코드 는 해당 하 는
returnedObject 을 생 성 합 니 다.@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.mvcMatchers("hello")
.hasAuthority("test")
.anyRequest()
.authenticated();
} 위의 코드 정의:
ConfigAttribute 요청 은 /hello 권한 이렇게 하면 우 리 는 이런 것 을 얻 을 수 있다
test.이것 은
ConfigAttribute 의 캡 처 이다.그 중 FilterSecurityInterceptor 에는 많은 것 securityMetadataSource 이 저장 되 어 있다.ConfigAttribute 하위 클래스 를 통 해 이 루어 진 AbstractSecurityInterceptor 방법 으로 이 를 얻 은 다음 에 이 를 통 해 이번에 사용 한 obtainSecurityMetadataSource 을 얻 을 수 있다.캡 처 된
Collection 은 requestMap 과 RequestMatcher 의 관 계 를 보존 했다.우리 가
Collection 을 요청 하면 첫 번 째 /hello, 즉 Collection 를 포함 하 는 것 을 얻 을 수 있다.우리 가 다른 인 터 페 이 스 를 요청 하면 두 번 째 인 터 페 이 스 를 얻 을 수 있다.이 어 이러한 획득
hasAuthority('test') 은 후속 검증 논리 에 사 용 될 수 있다.총결산
본 고 는 Spring Security Authorization 을 소개 하고
ConfigAttribute 어떻게 FilterSecurityInterceptor 의 마지막 사용 SecurityFilterChain 과 AccessDecisionManager 을 통 해 pre - invocation handling 과 after invocation handling 을 실현 하 는 지 에 중심 을 두 었 다.AfterInvocationManager 와 AccessDecisionManager 에 대해 서 는 내부 의 논 리 를 상세 하 게 소개 하지 않 고 하위 클래스 와 다른 인 터 페 이 스 를 어떻게 이용 하여 권한 검증 을 완성 하 는 지 소개 했다.그 내부 의 구체 적 인 세부 논 리 는 독자 가 스스로 연구 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.