ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @AuthenticationPrincipal null
    BackEnd/스프링 2022. 7. 28. 19:59

    CustomService 에서 반환하는 Class 인 User 클래스로 @AuthenticationPrincipal  어노테이션에 들어온다는 정보가 많은데, 그것은 스프링 기본인 AbstractUserDetailAuthenticationProvider 를 사용하면 UserDetailService 에서 반환한 객체를 principal 로 세팅하기 때문이고, 나는 Provider 를 직접 생성했고 principal 에 username (이메일) 정보만 꺼내서 넣었기 때문에 String 으로 값이 들어온다.

    @AuthenticationPrincipal  필드 타입을 잘못 지정하면 null 이 들어온다.

    CustomUserDetail.class

    //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);
    }

    반응형
Designed by Tistory.