-
@AuthenticationPrincipal nullBackEnd/스프링 2022. 7. 28. 19:59
CustomService 에서 반환하는 Class 인 User 클래스로 @AuthenticationPrincipal 어노테이션에 들어온다는 정보가 많은데, 그것은 스프링 기본인 AbstractUserDetailAuthenticationProvider 를 사용하면 UserDetailService 에서 반환한 객체를 principal 로 세팅하기 때문이고, 나는 Provider 를 직접 생성했고 principal 에 username (이메일) 정보만 꺼내서 넣었기 때문에 String 으로 값이 들어온다.
@AuthenticationPrincipal 필드 타입을 잘못 지정하면 null 이 들어온다.
//AbstractUserDetailAuthenticationProvider.class public Authentication authenticate(Authentication authentication) throws AuthenticationException { Assert.isInstanceOf(UsernamePasswordAuthenticationToken.class, authentication, () -> { return this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.onlySupports", "Only UsernamePasswordAuthenticationToken is supported"); }); String username = this.determineUsername(authentication); boolean cacheWasUsed = true; UserDetails user = this.userCache.getUserFromCache(username); if (user == null) { cacheWasUsed = false; try { user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication); } catch (UsernameNotFoundException var6) { this.logger.debug("Failed to find user '" + username + "'"); if (!this.hideUserNotFoundExceptions) { throw var6; } throw new BadCredentialsException(this.messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); } Assert.notNull(user, "retrieveUser returned null - a violation of the interface contract"); } try { this.preAuthenticationChecks.check(user); this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication); } catch (AuthenticationException var7) { if (!cacheWasUsed) { throw var7; } cacheWasUsed = false; user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication); this.preAuthenticationChecks.check(user); this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication); } this.postAuthenticationChecks.check(user); if (!cacheWasUsed) { this.userCache.putUserInCache(user); } Object principalToReturn = user; if (this.forcePrincipalAsString) { principalToReturn = user.getUsername(); } return this.createSuccessAuthentication(principalToReturn, authentication, user); } protected Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user) { UsernamePasswordAuthenticationToken result = UsernamePasswordAuthenticationToken.authenticated(principal, authentication.getCredentials(), this.authoritiesMapper.mapAuthorities(user.getAuthorities())); result.setDetails(authentication.getDetails()); this.logger.debug("Authenticated user"); return result; }
//UsernamePasswordAuthenticationToken.class public static UsernamePasswordAuthenticationToken authenticated(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) { return new UsernamePasswordAuthenticationToken(principal, credentials, authorities); }
반응형'BackEnd > 스프링' 카테고리의 다른 글
@Valid 위치 (0) 2022.07.29 BDDMokito.given return null (0) 2022.07.29 @Builder 위치와 연관관계 세팅 (0) 2022.07.24 @Value 는 객체 bean 등록 필수, static 키워드 사용 x (0) 2022.07.23 form-data RequestDTO 매핑 @Setter 필수 (0) 2022.07.23