@WithAnonymousUser
- Spring Security 의 테스트에서 사용된다.
- 테스트 중인 해당 메서드가 익명 사용자 즉, 인증되지 않은 사용자로 접근한 경우를 테스트하고 싶은 경우 사용할 수 있다.
@Test
@DisplayName("인증되지 않은 사용자가 보호된 경로에 접근하는 경우 401 Unauthorized 응답을 받는다.")
@WithAnonymousUser
public void When_UnauthorizedUserAccessProtectedPath_Expect401() throws Exception {
//when
this.mockMvc.perform(get("/v1/api/cart/add"))
.andExpect(status().isUnauthorized());
}
- 내부소스
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@WithSecurityContext(
factory = WithAnonymousUserSecurityContextFactory.class
)
public @interface WithAnonymousUser {
@AliasFor(
annotation = WithSecurityContext.class
)
TestExecutionEvent setupBefore() default TestExecutionEvent.TEST_METHOD;
}
- SecurityContext 안에
WithAnonymousUserSecurityContextFactory
를 주목하자
final class WithAnonymousUserSecurityContextFactory implements WithSecurityContextFactory<WithAnonymousUser> {
WithAnonymousUserSecurityContextFactory() {
}
public SecurityContext createSecurityContext(WithAnonymousUser withUser) {
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(new String[]{"ROLE_ANONYMOUS"});
Authentication authentication = new AnonymousAuthenticationToken("key", "anonymous", authorities);
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authentication);
return context;
}
}
- 실제 인증받지 않은 사용자는 아니긴하다.
- 정확하게 말하면 익명의 권한을 가진, 로그인되지 않은 사용자를 의미하는데..
- 내부적으로 시큐리티 컨텍스트를 비우고, AnonymousAuthenticationToken 에서 익명의 이름, 권한을 채운 토큰값을 컨텍스트에 세팅해준다.
익명사용자
- 기본적으로 인증받지 않은 사용자는 시큐리티에서
ROLE_ANONYMOUS
의 역할을 가진다.
즉,
해당 WithAnonymousUser 는 사용자가 없다는 것은 아니고 user ==null
X
익명의 사용자가 특정 리소스에 접근하려고 시도하는 테스트 케이스라고 볼 수 있다.
내 시큐리티 소스상
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated() // 모든 요청에 대해 인증을 받도록 설정
)
- 일단 모든 요청에 대해 인증을 받도록 설정했기에
- @WithAnonymousUser 를 설정한 테스트에서
- 무조건
HttpStatus.UNAUTHORIZED
이 발생하게 될 것이다.
Uploaded by N2T
'자바 > Spring Security' 카테고리의 다른 글
[JWT] 리프레쉬 토큰 - 엑세스 토큰 (0) | 2024.01.19 |
---|---|
[Security] PasswordEncoder..? (0) | 2024.01.19 |
[Security] __AuthorizationFilter?__ (0) | 2024.01.19 |
[Spring Security] JwtAuthenticationFilter 관련 (0) | 2024.01.19 |