9 글 보임 - 1 에서 9 까지 (총 9 중에서)
-
글쓴이글
-
2024년 4월 13일 20:44 #120183
파라쿤참가자'로그인 기능 2' 숙제로 로그아웃 구현하려고 버튼에 fetch('/logout') 달아서 눌렀습니다. 제가 예상한 결과는 그냥 세션만 없어지고 익명 상태가 될 줄 알았는데, 지우고 난 뒤로 어떤 페이지로 접속해도 message로 An error happened during template parsing (template: "class path resource [templates/접속하려는 html]") (에러코드는 500) 에러가 뜹니다. 근데 다 껐다키고 난리를 쳐도 저 에러가 떠서 미칠뻔했는데 SecurityConfig에 있는 함수 다 지우고 접속하니까- >라이브러리 디폴트 로그인창 뜨고 거기에 db에 있던 정보 입력하니까 다행히 세션받고 다시 다 접속이 되더라고요 gpt에 에러코드 통째로 넘겨봐서 물어봐도 그냥 에러코드 그대로 뭐 파싱을 잘 해라 이런소리밖에 안하더라구요 그나마 제가 이짓저짓 해보면서 정리한 현재 상황은 1. 로그인 세션 있을때만 사이트(list 포함한 모든 링크)접속가능 2. /logout 하거나 웹에서 수동으로 세션 쿠키 지우면 -> 위의 에러 나면서 모든 링크에서 에러 3. 그래서 임시로 SecurityConfig 안에 SecurityFilterChain 함수 지우고 접속하면 기본 로그인 뜨는데, 거기다 로그인하고 세션 받으면 당분간 접속은 가능 인 상황입니다. 그래서 이런저런 추론을 해보려 했는데 뭐 익명 상태가 되는 그런게 아니라, 세션이 없으면 html로드 자체가 이렇게 안되니까 뭐가 문제일지 잘 감이 안와서 죄송ㅎ바ㅣ다 이 뒤는 혹시몰라 SecurityConfig도 첨부합니다
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf((csrf)->csrf.disable()); http.authorizeHttpRequests((authorize) -> authorize.requestMatchers("/**").permitAll() //일단 "/**으로 모두허용" ); http.formLogin((formLogin) -> formLogin.loginPage("/login") .defaultSuccessUrl("/") .failureUrl("/login") //안쓰면 기본적으로 /login?error ); http.logout(logout->logout.logoutUrl("/logout")); return http.build(); }
}
죄송합니다죄송합니다죄송합니다 ++ 현재 Authentication auth 는 null인 상태입니다
-
이 게시글은
파라쿤에 의해 1 년, 2 월 전에 수정됐습니다.
2024년 4월 14일 09:40 #120210
codingapple키 마스터html파일이랑 SecurityConfig에 csrf기능 켜져있어서 그런걸수도요 끈거 확인하고 테스트해봅시다 아니면 뒤에 logout.logoutUrl("/logout") .invalidateHttpSession(true) .deleteCookies("JSESSIONID") 이런거 붙여봅시다
2024년 4월 15일 02:27 #120286
파라쿤참가자혹시몰라 하루동안 모든 상황을 가정해서 처음부터 강의 복습겸 다지우고 이번에는 변수명 파일명 통일시켜서 다시 작성해봤습니당. 그래도 어떠한 경로든(/logout get, cookie 삭제) 로그아웃을 진행하면An error happened during template parsing (template: "class path resource [templates/[접속html]") 에러가 발생하더라구여. crsf도 껐다 켰다 해보고, 혹시 몰라 에디터에서 추천하는 방식인 http.csrf(AbstractHttpConfigurer::disable); 도 사용해봤는데 같은 현상이었습니다. 타임리프 문법 문제일까 싶어 빈 html을 연결해봐도 같은 에러가 발생했고, 해외 git 이슈들을 찾아봤는데 정확히 같은 상황은 발견하지 못했지만 디펜던시 문제라는 얘기가 많이 있길래 build.gradle 에 틀린 부분이 있을까 찾아보기 시작했습니다. 영상에 나온 모든 build.gradle의 dependencies를 다 수정 검토해봤지만 차이를 만들지 못했고, 결국 이리저리 버전 문제일 수도 있겠다는 글을 보고 thymeleaf-extras-springsecurity의 버전을 5로 낮췄더니 로그아웃 에러 상황에서 5버전은 에러를 발생시키지 않았습니다. 근데 5버전으로 낮추니까 뭐 당연할 수도 있겠지만 mypage적용된 sec: 기능들이 제대로 작동을 안하길래 5버전 문법 검색해서 써봤습니다. 그치만... 5버전 타임리프 문법을 쓰니까 또 같은 에러가 뜨더라고요...T_T 결국 버전은 다시 강의와 같이 6:3.1.1.RELEASE 로 돌아와서 사용중인데 이런데서 막히고 정보도 못찾으니까 갈피를 못잡겠습니다 ㅜㅜ 그래서 일단 지금 임시로 사용중인 방법은 1. 로그아웃 -> 에러나서 모든 url 파싱에러(바닐라 html포함) 2. SecurityConfig의 filterChain Bean 싹 지우고 재접속 -> spring security 기본 로그인 화면 나옴 3. db에 저장해뒀던 아이디 비번 치고 입장 -> 다시 로그인 세션 생긴 순간부터는 모든 기능 다 정상작동 4. 이제 다시 fiterChain ctl+z로 살려와서 빌드해도 로그아웃 전까지는 에러없음
이런 상황이라 제 추측상 원인이 생길 수 있는 SecurityConfig와 build.gradle에서 정말 해볼 수 있는걸 다 해보려 했는데 강의 내용과 다른점도 못찾겠어서 통 모르겠습니다... 그 외에 검색중 알아낸 바로는 필터체인을 throws Exeption으로 에러를 던지게 하지 말고 try catch로 받아서 다음단계로 넘어가 permitAll을 해야 한다...라는 글이었는데 https://velog.io/@choidongkuen/Spring-Security-SecurityConfig-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-permitAll-%EC%9D%B4-%EC%A0%81%EC%9A%A9%EB%90%98%EC%A7%80-%EC%95%8A%EC%95%98%EB%8D%98-%EC%9D%B4%EC%9C%A0 그나마 git issue 제외하고 제일 영양가 있던 정보였던 것 같은데 소화해내지 못했습니다 이제 남은 제 합리적 의심은 그냥 다 필요없고 에디터까지 싹다 재설치해서 html만 백업해뒀다가 다시 작성하는건데, 팁이 혹시라도 남아있다면 전수 부탁드리겠습니다... 뭐가 원인인지 힌트라도 얻으려고 제가 해본 짓거리 정리해봤습니당 springsecurity6:3.1.1.RELEASE 를 springsecurity5 버전으로 변경 -> 놀랍게도...? 6버전에서 에러일때 5버전으로 같은 페이지 로딩이 됐지만, sec 등 타임리프 작동안함 -> 5버전에 맞는 문법 사용하니까 바로 다시 에러 permitAll이 제대로 작동하지 않는 것인가 싶어 /** permit 대신 수동으로 링크 '/list' 허용 -> error.html은 안뜨고 권한이 없어서 접근불가라는 크롬 디폴트 페이지 뜸 그 외 필터체인 함수 속 http.formLogin , logout 등 한줄씩 없애가며... -> 소용없음 SecurityFilterChain 통째로 없애지 않으면 spring 기본 로그인창도 안뜸 Authentication 몬가 제대로 못받고 있어서 아무튼 어떻게 에러 생기는거 아님? -> sout 해봐도 로그인 상태에서는 모두 정상출력 , 로그아웃 후에는 캐시 강제제거, deleteCookies 달아도 에러... csrf? -> 강의 영상대로 disable이나 신문법같은? AbstractHttpConfigurer::disable로 해도 뭔가의 차이는 발견하지 못함... 버전? - > springframework.boot' version '3.2.4' , spring.dependency-management' version '1.1.4' 입니다 여기까지 건드렸다가 대환장파티나서 걍 처음으로 돌아옴
우선 조금만 더 기 안빨리는 선에서 찾아보고 안되면 환경 싹다 재설치해보고 그래도 안되면 스프링 다 듣고 끊으려던 프리패스 끊고 node.js나 듣다 돌아오겠습니다... 해결하면 업데이트 하겠습니다... (멍청이식 git 저장 https://github.com/seemsblue/spring-shop
숙제도 너무 좋고 강의 시간보다 혼자 짜는 시간이 길이서 실력 느는거 같아서 너무 좋았는데 ㅡㅏㅏㅏㅏㅏㅏㅏㅏ
2024년 4월 15일 09:26 #120300
codingapple키 마스터nav.html에 principal.username 이런거 없다는에러가 뜨는거같은데 로그인시에만 그런거 보여달라고 타임리프 if문 씁시다
2024년 4월 15일 16:12 #120358
파라쿤참가자와 진짜 th:if="principal != null" ~ 로 해결했습니다 감사합니다.................................................................................. 그래두 이것저것 건들면서 돌아가는거 조금이나마 공부된거 같아서 다행이네요 진짜 감삼다
-
이 답변은
파라쿤에 의해 1 년, 2 월 전에 수정됐습니다. 이유: 문법 살짝 달라서 혼동생길까봐
2024년 4월 15일 18:06 #120376
파라쿤참가자알고보니 챗gpt급 알고있다고 생각하는 할루시네이션 현상이었습니다.
<hr />
<th:block th:if="${principal != null}"> <p sec:authentication="principal.username"></p> <button th:onclick="fetch('/logout')">로그아웃</button> </th:block>
<th:block th:if="${principal == null}"> <button onclick="window.location.href='/login'">로그인</button> </th:block>
<hr />
실험을 위해서 이 html로 nav바를 구성하고 빈 html에 장착해 해봤는데 로그인 상태에서 로그인 버튼이 보이는 문제가 생겼습니다 그래서 그냥 단순히 조건문의 !=와 ==을 바꿔서 사용하면 되는 것 아닌가? 했는데 로그아웃을 하면 또 if문이 수정 전 의도대로 작동해서, principal == null 쪽의 "principal.username"을 출력하는 함수가 실행되어 에러를 발생시키네요 그러니까 [로그인 세션상태 ->"${principal == null}"==true로 작동(의도와 반대)], [로그아웃 상태 -> ${principal == null}" == true로 작동(원래 의도)]??? 의 형태로 작동하는 기현상이 일어나고 있습니다. 아무래도 처음부터 완전히 갈피를 못잡고 이상하게 에러가 나던 이유도 아마도 이것 때문이었던 것 같읍니다... 정리하자면 지금까지 로그인 상태일때 principal.username을 읽는 if코드로 짜면, 에러가 안남 -> 로그아웃을 하면 if조건이 역전되어서 이때도 principal.username를 읽으려 해서 에러 발생 -> 이 과정이었던 것 같습니다... 계속 해결못해서 죄송합니다...
-
이 답변은
파라쿤에 의해 1 년, 2 월 전에 수정됐습니다.
2024년 4월 15일 21:31 #120404
codingapple키 마스터로그아웃해도 principal변수가 null이 아니라 다른게 나올수도요 출력해봅시다
-
이 답변은
codingapple에 의해 1 년, 2 월 전에 수정됐습니다.
2024년 4월 16일 13:44 #120450
Kun참가자정확한 문법 차이는 모르겠지만 아래와 같이 사용하니까 정상작동 합니다.
<th:block sec:authorize="isAuthenticated()"> <h2><span sec:authentication="principal.username"></span>님 환영합니다!</h2> <button th:onclick="fetch('/logout')">로그아웃</button> </th:block>
<th:block sec:authorize="isAnonymous()"> <div align="right"> <button onclick="window.location.href='/login'">로그인</button> </div> </th:block>
2024년 4월 16일 17:35 #120477
파라쿤참가자오 저도 마침 sec으로 돌아가서 구현했는데 되던 참에 다들 도와주셔서 정말 감사합니다! 최종적으로는 저도 th:block sec:authorize="isAnonymous()" 와 같은 형태로 해결했습니다. 코딩애플님이 말씀해주셨던것처럼 타임리프에서 principal같은걸 읽을 때 잘못된 값을 불러오는 경우가 전체적인 원인이었습니다. 그리고 그 뒤는 아마 타임리프 if문의 사용에 대한 이해도가 떨어져서 생겼던 에러들이었던 것 같습니다. 혹시라도 저같은 허접분들이 있지는 않겠지만 정리해놓겠습니다. 1. 에러 페이지 구현했다면 타임리프 문법과 관련된 문제는 파싱에러로(500) 메시지 뜰수도? 2. th:if안에 조건 작성할때 {} , # , $ 등 잘못쓴걸수도? (저도 잘 모름 그냥 구글에 영어로 검색해서 사람들 쓰는거 보고 고치는게 빠름) 3. 로그아웃 상태에서 타임리프의 principal은 null이 아니라 anonyMous였나가 들어있던데, 모든 상황에 대해서는 저는 잘 모르겠으니 대신 검사해주는 sec:authorize="isAuthenticated()"같은거 잘 씁시다. 이외에도 많지만 나머지는 자바에서 바로 출력해보면서 확인하면 해결할 수 있는 문제일 것 같습니다. !!!!타임리프는 출력실험 해볼때 nav같은거 다 뗀 페이지에서 합시다!!!! + 앞으로 혼자 하더라도 github를 메모장으로 사용하는게 좋은 것 같습니다. 저같은 허접은 ctrl z로 하면 언제 어디를 고치고 실험해 봤는지 기억도 못하기 때문에 "얼마전에 이 부분이 될때는 이렇게 썼구나" 이런거 봐야됨
nav에서 로그아웃때 에러 -> 엉뚱 my page를 이상하게 고침 -> 엉뚱 security 칼질 -> nav 삭제 -> 되어야하지만 이미 my page가 이상한 문법으로 에러나있음 -> 통제 안함 개판
<h3>감사합니다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</h3>
-
이 답변은
파라쿤에 의해 1 년, 2 월 전에 수정됐습니다.
-
이 게시글은
-
글쓴이글
9 글 보임 - 1 에서 9 까지 (총 9 중에서)
- 답변은 로그인 후 가능합니다.