Spring boot Security와 sencha 연동시 고려사항
2024. 8. 3. 22:06ㆍJava/Spring Boot Security
1. 'csrf' 정보를 같이 전송하지 않으면, 에러 발생함
특별히 'csrf'와 관련해서 에러에 표시되는 부분이 없음
# html 파일
# 서버에서 csrf 정보를 가져옴
<body>
<div th:id="${_csrf.parameterName}" th:text="${_csrf.token}" style="display:none"></div>
</body>
# js 파일
# html의 csrf 정보를 참조하여 header에 설정함
form.submit({
params: {
'_csrf': document.getElementById('_csrf').innerText
},
success: function(form, action) {
},
failure: function(form, action) {
}
});
2. 서버와 연동
성공/실패 handler 추가
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests
.requestMatchers(exceptUrl).permitAll()
.anyRequest().authenticated())
.formLogin((form) -> form
.loginPage("/login")
.successHandler(customAuthenticationSuccessHandler)
.failureHandler(customAuthenticationFailureHandler)
.permitAll())
.logout((logout) -> logout.permitAll());
return http.build();
}
Ajax 여부를 판단해서 결과 처리
private boolean isAjaxRequest(HttpServletRequest request) {
return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
}
public void onAuthenticationSuccess(생략) {
생략
// referer 정보가 없는 경우, 메인화면으로 이동하도록 함
String targetUrl = "/";
if(savedRequest != null) {
targetUrl = savedRequest.getRedirectUrl();
}
if (isAjaxRequest(request)) {
response.setContentType("application/json;charset=UTF-8");
response.setStatus(HttpServletResponse.SC_OK);
JSONObject data = new JSONObject();
data.put("success", true);
data.put("msg", "테스트 성공!!");
data.put("redirect", targetUrl);
PrintWriter writer = response.getWriter();
writer.print(data);
writer.flush();
} else {
requestCache.removeRequest(request, response);
// Proceed with the redirect
getRedirectStrategy().sendRedirect(request, response, targetUrl);
}
생략
}
서버 결과 받아서 처리
# response.responseText 아래에 서버에서 보낸 json 정보가 있음
# 서버에서 받은 정보를 기준으로 redirect 처리함
form.submit({
params: {
'_csrf': document.getElementById('_csrf').innerText
},
success: function(form, action) {
let result = JSON.parse(action.response.responseText);
window.location.href = result.redirect;
},
failure: function(form, action) {
let result = JSON.parse(action.response.responseText);
Ext.Msg.alert('Failed', result.msg);
}
});
'Java > Spring Boot Security' 카테고리의 다른 글
Spring boot Security blocked:mixed-content 에러 (0) | 2024.08.11 |
---|---|
Spring boot Security 302 에러 (0) | 2024.08.11 |
Spring boot Security와 ajax 연동 (0) | 2024.07.29 |
Spring boot Security redirect 정보 가져오기 (0) | 2024.07.29 |
Spring boot Security redirect after logging (0) | 2024.07.29 |