MelRanG
709
2021-09-15 19:27:22
0
68

Oauth2 로그인 세션관련 질문있습니다!


현제 페이지 이동시 {{#UserId}}를 받지 못하는 문제가 발생하고 있습니다.

로그인 후 헤더에 로그아웃이 떠있고 글쓰기 페이지로 이동하면 헤더에 로그인이 떠있습니다. 글쓰기는 잘 되며 글쓰고 메인페이지로 이동하면 다시 로그아웃으로 바뀝니다.

새로운 페이지로 이동할 때 마다 풀리는데


매 페이지마다 컨트롤러에서

if (user != null){

            model.addAttribute("userName", user.getName());
        }


이 코드를 추가하면 해결되는데 페이지마다 작성할 순 없어서 질문드립니다.

어떻게 다른 뷰에 넣은 값을 확인할 수 있을까요..?? 세션에 값을 넣었는데 그 값을 컨트롤러 마다 조회해야하는건가요?




OAuth2UserService
@RequiredArgsConstructor
@Service
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
    private final UserRepository userRepository;
    private final HttpSession httpSession;

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2UserService delegate = new DefaultOAuth2UserService();
        OAuth2User oAuth2User = delegate.loadUser(userRequest);

        String registrationId = userRequest.getClientRegistration().getRegistrationId();
        String userNameAttributeName = userRequest.getClientRegistration().getProviderDetails()
                .getUserInfoEndpoint().getUserNameAttributeName();

        OAuthAttributes attributes = OAuthAttributes.of(registrationId, userNameAttributeName, oAuth2User.getAttributes());

        User user = saveOrUpdate(attributes);
        httpSession.setAttribute("user", new SessionUser(user));

        return new DefaultOAuth2User(
                Collections.singleton(new SimpleGrantedAuthority(user.getRoleKey())),
                attributes.getAttributes(),
                attributes.getNameAttributeKey());
    }


    private User saveOrUpdate(OAuthAttributes attributes) {
        User user = userRepository.findByEmail(attributes.getEmail())
                .map(entity -> entity.update(attributes.getName(), attributes.getPicture()))
                .orElse(attributes.toEntity());

        return userRepository.save(user);
    }
}


controller

@RequiredArgsConstructor
@Controller
public class indexController {

    private final PreferencePerfumeService preService;
    private final HttpSession httpSession;

    @GetMapping("/")
    public String index(Model model, @LoginUser SessionUser user){
        model.addAttribute("prePerfume", preService.findAllDesc());
        if (user != null){
            model.addAttribute("userName", user.getName());
        }
        return "index";
    }

    @GetMapping("/perfume/save")
    public String perfumeSave(){
        return "perfume-save";
    }
}

perfume-save


{{>layout/header}}

{{>layout/footer}}

header


<nav class = "navbar navbar-expand-lg navbar-light bg-light">
    <div class="container px-4 px-lg-5">
        <a class="navbar-brand" href="/">Perfume Service</a>
        <div class="navbar-collapse collapse" id="navbarSupportedContent">
            <ul class="navbar-nav me-auto mb-2 mb-lg-0 ms-lg-4">
                {{#userName}}
                <li class="nav-item">
                    <span class="nav-link active" id="user" aria-current="page">{{userName}}</span>

                </li>
                <li class="nav-item">
                    <a href="/logout" class="nav-link active" role="button">Logout</a>
                </li>
                {{/userName}}
                {{^userName}}
                <li class="nav-item">
                    <a href="/oauth2/authorization/google" class="nav-link active" aria-current="page" >구글로그인</a>
                </li>
                <li class="nav-item">
                    <a href="/oauth2/authorization/naver" class="nav-link active" aria-current="page" >네이버로그인</a>
                </li>
                {{/userName}}
            </ul>
        </div>
        <div class="col-lg-4">
            <form action="" method="GET">
                <input type="text" class = "form-control rounded-pill" placeholder="향수명 검색" aria-describedby="button-addon2">
            </form>
        </div>
</nav>

LoginUser.java

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}


LoginUserArgumentResolver.java

@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {

private final HttpSession httpSession;

@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
return isLoginUserAnnotation && isUserClass;
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return httpSession.getAttribute("user");
}
}

webConfig.java

@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(loginUserArgumentResolver);
}
}


0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.