인프런 커뮤니티 질문&답변

hangs0908님의 프로필 이미지
hangs0908

작성한 질문수

스프링 시큐리티 OAuth2

OAuth 2.0 Social Login 연동 구현 (3)

Naver Login시 권한에 대해 질문이 있습니다

작성

·

428

·

수정됨

0

CustomAuthorityMapper 클래스에서

강사님과 코드는 동일하나

authorities가 넘어올시에 위와 같이 넘어옵니다.

그래서 강사님 영상과 다르게

ROLE_USER만이 authority에 대해서 담기게 되고

위의 사진은 hasRole 권한을 해제하여 찍어본것입니다.

 

/api/user에 진입이 불가합니다

 

코드는 동일한데 뭐가 문제일까요,,,? 강사님의 네이버 로그인시는 response를 안벗기고도 진입이 가능해서 질문드립니다

 

package io.security.oauth2.sociallogin;

import lombok.RequiredArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

public class CustomAuthorityMapper implements GrantedAuthoritiesMapper {

    private String prefix = "ROLE_";

    @Override
    public Set<GrantedAuthority> mapAuthorities(Collection<? extends GrantedAuthority> authorities) {
        HashSet<GrantedAuthority> mapped = new HashSet<>(authorities.size());

        for (GrantedAuthority authority : authorities) {
            mapped.add(mapAuthority(authority.getAuthority()));
        }

        return mapped;
    }

    private GrantedAuthority mapAuthority(String name) {
        if(name.lastIndexOf(".") > 0){
            int index = name.lastIndexOf(".");
            name = "SCOPE_" + name.substring(index+1);
        }
        if (!this.prefix.isEmpty() && !name.startsWith(this.prefix)) {
            name = this.prefix + name;
        }
        return new SimpleGrantedAuthority(name);
    }
}

 

답변 2

0

네이버에서 access token 응답으로 scope를 안 넣어주네요...

keycloak, google은 넣어주는데 말이죠.

실제 액세스토큰을 갖고오는 부분에서 응답의 scope를 읽고 액세스토큰 객체를 생성하고
이 scope들을 기반으로 OidcUserSErvice든 DefaultOAuth2UserSErvice든 scope 값을 사용해서 권한을 만드는데 그 과정에서 권한이 하나도 만들어지지 않기 때문에 문제가 생긴것 같습니다.

0

안녕하세요, hangs0908님. 해당 코드를 보면 CustomAuthorityMapper 클래스가 제공된 것 같습니다. 이 클래스는 authentication을 처리하여 authorities(권한)를 매핑하는 역할을 합니다. authorities가 넘어올 때, ROLE_USER만 담기는 이유와 /api/user에 진입이 안되는 이유를 알고 싶으신 건가요?

첫 번째로, authorities가 넘어올 때 ROLEUSER만 담기는 이유는 코드의 로직 때문입니다. CustomAuthorityMapper 클래스의 mapAuthorities 메소드 내에서 authorities를 HashSet에 담고 있습니다. 이때 mapAuthority 메소드를 호출하여 권한의 이름을 변환합니다. prefix가 지정되어 있으면 해당 prefix를 붙여주고, name에 “SCOPE“를 붙여주는 로직이 있습니다. 해당 로직을 확인해보시고, 강사님의 영상과 동일하도록 수정해보세요.

두 번째로, /api/user에 진입이 안되는 이유는 권한 설정에 대한 문제일 수 있습니다. 강사님의 네이버 로그인 코드에서는 response를 벗기지 않아도 해당 URL에 진입이 가능한 것 같습니다. 하지만 해당 코드에서는 권한에 대한 설정이 적용되고 있으므로, 권한을 확인해보시는 것이 좋을 것 같습니다. 강사님의 영상과 동일하게 권한 설정을 만들어 주세요.

위의 두 가지를 확인하고 수정해보시면 원하는 결과를 얻을 수 있을 것입니다. 수고하세요!

hangs0908님의 프로필 이미지
hangs0908
질문자

강사님과 코드 똑같은데 뭐가 문제일까요,,,?

hangs0908님의 프로필 이미지
hangs0908

작성한 질문수

질문하기