inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링과 JPA 기반 웹 애플리케이션 개발

REST API로 로그인 설정 시 remember-me 문제

643

이예슬

작성한 질문수 1

0

안녕하세요, 기선님. 항상 강좌 잘 듣고 있습니다! 다름이 아니라, 제가 이 강좌를 바탕으로 현재 프로젝트를 진행중인데 프론트엔드는 Vue.js로 진행하므로 rest api를 사용하고 있습니다. 현재 postman으로도 테스트중인데 alwaysRemember 값을 true로 설정해도 remember-me 쿠키가 들어오지 않더라구요 ㅜㅜ 하지만 네이버 oauth2 로그인을 하면 또 멀쩡하게 들어옵니다.. 현재 일반 로그인에서는 리다이렉션을 막아뒀는데 혹시 그것과 관련이 있을까요? 며칠동안 이것저것 찾아보다 도저히 답이 안나와서 이렇게 질문 남깁니다..

코드도 첨부하겠습니다

@Component
public class AuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
response.setStatus(HttpServletResponse.SC_OK);
}

}
@Slf4j
public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

private boolean postOnly = true;
private HashMap<String, String> jsonRequest;

@Override
protected String obtainPassword(HttpServletRequest request) {
String passwordParameter = super.getPasswordParameter();
if(request.getHeader("Content-Type").equals(ContentType.APPLICATION_JSON.getMimeType())) {
return jsonRequest.get(passwordParameter);
}
return request.getParameter(passwordParameter);
}

@Override
protected String obtainUsername(HttpServletRequest request) {
String usernameParameter = super.getUsernameParameter();
if(request.getHeader("Content-Type").equals(ContentType.APPLICATION_JSON.getMimeType())) {
return jsonRequest.get(usernameParameter);
}
return request.getParameter(usernameParameter);
}


@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response){

if(postOnly && !request.getMethod().equals("POST")) {
throw new AuthenticationServiceException("Authentication method not supported : " + request.getMethod());
}

if(request.getHeader("Content-Type").equals(ContentType.APPLICATION_JSON.getMimeType())) {
ObjectMapper objectMapper = new ObjectMapper();
try {
this.jsonRequest = (HashMap<String, String>) objectMapper.readValue(request.getReader().lines().collect(Collectors.joining()),
new TypeReference<Map<String, String>>() {
});
} catch (IOException e) {
e.printStackTrace();
throw new AuthenticationServiceException("Request Content-Type(application/json) Parsing Error");
}
}

String username = obtainUsername(request);
String password = obtainPassword(request);
//String rememberMe = request.getParameter("remember-me");

if(username == null) username = "";
if(password == null) username = "";
username = username.trim();

UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);

setDetails(request, authRequest);

return this.getAuthenticationManager().authenticate(authRequest);
}

@Override
public void setPostOnly(boolean postOnly) {
this.postOnly = postOnly;
}
}
@Override
protected void configure(HttpSecurity http) throws Exception {

http.oauth2Login()
.userInfoEndpoint()
.userService(customOAuth2UserService);
http.exceptionHandling()
.authenticationEntryPoint(restAuthenticationEntryPoint); // 인증 실패시 401
http.formLogin().disable();
http.logout()
.logoutSuccessUrl("/");

// 로그인 유지
String rememberKey = "remember_me";
http.rememberMe()
.key(rememberKey)
.rememberMeParameter(rememberKey)
.rememberMeCookieName(rememberKey)
.userDetailsService(memberService)
.alwaysRemember(true)
.tokenRepository(tokenRepository());

http.csrf().disable();
http.cors();


// Json
http.addFilterBefore(customAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);



}

// Json
@Bean
public CustomAuthenticationFilter customAuthenticationFilter() throws Exception {
CustomAuthenticationFilter filter = new CustomAuthenticationFilter();
try {
filter.setFilterProcessesUrl("/login");
filter.setAuthenticationManager(this.authenticationManagerBean());
filter.setUsernameParameter("email");
filter.setPasswordParameter("password");
filter.setAuthenticationSuccessHandler(authSuccessHandler);
//filter.setAuthenticationFailureHandler(authFailureHandler);
} catch (Exception e) {
e.printStackTrace();
}

return filter;
}


@Bean
public PersistentTokenRepository tokenRepository() {
JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
jdbcTokenRepository.setDataSource(dataSource);
return jdbcTokenRepository;
}

thymeleaf spring-boot JPA java spring

답변 1

0

백기선

글쎼요. 설정을 보니 CustomAuthenticationFilter를 사용하고 계신데요 그 필터를 빼고 다시 해보시면 어떤가요? 디버깅을 하면서 왜 remember-me 쿠키를 만들지 않는지 살펴봐야 할 것 같습니다.

Study 개설하는 로직에 대해서 궁금점이 있습니다.

0

55

1

앱 재시작 후 회원가입

0

101

1

app.host 관련 질문이 있습니다

0

97

1

강의 버전 정보

0

124

1

event, study 참조

0

218

2

비밀번호 변경 로직 질문있습니다.

0

135

1

프로필 수정 처리 merge 질문입니다.

0

105

1

회원가입 성공 후 redirect이동시 권한 질문

0

490

3

HtmlEmailService 개발하다 생긴 의문입니다

0

248

2

postgreSql 연결하여 JPA 를 통해 테이블 생성시 ZONE 테이블 생성에서 에러가 납니다

0

429

2

수업질문 [긴급] 로그인안되는 문제 말씀해주시는 부분 반영해서 최종 질문드립니다

0

259

2

[긴급-재업로드]수업질문 로그인 안 되는 문제

0

234

1

[긴급] 로그인해도 네비게이션 바가 안 바뀌고 있습니다!! 로그인이 안 됩니다 도와주세요

0

276

1

cropper 오류 문제로 질문드립니다..

0

285

2

authentication관련 질문...

0

494

2

모임참가 취소 할때 로직 질문

0

349

3

안녕하세요 기선님 질문이있습니다..

0

228

1

HTML코드 및 강의 중간자료들

0

678

3

springSecurity

0

519

2

버전 질문입니다.

0

300

1

부트스트랩, css

0

352

2

영속성 컨텍스트 질문

0

247

2

다시 강의를 보니 드는생각..

0

350

2

5:50에 나오는 HTML코드는 어디서 찾을 수 있나여?

0

312

1