REST API로 로그인 설정 시 remember-me 문제
643
작성한 질문수 1
안녕하세요, 기선님. 항상 강좌 잘 듣고 있습니다! 다름이 아니라, 제가 이 강좌를 바탕으로 현재 프로젝트를 진행중인데 프론트엔드는 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;
}
답변 1
0
글쎼요. 설정을 보니 CustomAuthenticationFilter를 사용하고 계신데요 그 필터를 빼고 다시 해보시면 어떤가요? 디버깅을 하면서 왜 remember-me 쿠키를 만들지 않는지 살펴봐야 할 것 같습니다.
Study 개설하는 로직에 대해서 궁금점이 있습니다.
0
55
1
앱 재시작 후 회원가입
0
101
1
app.host 관련 질문이 있습니다
0
96
1
강의 버전 정보
0
124
1
event, study 참조
0
218
2
비밀번호 변경 로직 질문있습니다.
0
134
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
284
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





