html 발생 오류
Namespace 'sec' is not bound
네임스페이스 'sec'이(가) 바인딩되지 않았습니다
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-security'
html
: sec:authorize가 되는지 안되는지 확인을 위해 href 는 로그인으로 설정하고 문구만 달리해서 실행해봤다.
<html xmlns:th="http://www.thymeleaf.org">
<div th:fragment="navFragment"
class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-m">
<h5 class="my-0 mr-md-auto font-weight-normal">Index</h5>
<nav class="my-2 my-md-0 mr-md-3">
<a class="p-2 text-dark" href="#">도서 목록</a>
<a class="p-2 text-dark" href="#">사내 문서</a>
<a class="p-2 text-dark" href="#">게시판</a>
<a class="p-2 text-dark" href="#">관리자</a>
</nav>
<a class="btn btn-outline-info" sec:authorize="isAnonymous()" th:href="@{/login}">로그인</a>
<a class="btn btn-outline-info" sec:authorize="isAuthenticated()" th:href="@{/login}">로그아웃</a>
</div>
</html>
로그인 여부따라 로그인/로그아웃 버튼을 표출 시키고 싶었는데 버튼이 모두 표출되었다.
sec:authorize="isAnonymous()"
sec:authorize="isAuthenticated()
찾다보니 무슨 로그인이랑은 무관하다 권한에 따라 다르다는 엉터리 글도 많고, 여러 방법 시도해봤음.
시도1. html 태그에 해당 내용 추가하기
sec은 타임리프 관련이라고 본터라 .. 둘다 추가해보기도 하고 하나만 추가해보기도 함.
심지어 나는 타임리프 레이아웃도 사용중이라 연관된 html 태그는 다 수정해봤음.
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
시도2. sec 다르게 사용해보기
sec:authorize access="isAnonymous()"
sec:authorize access="isAuthenticated()"
결론은, 대 실패
build.gradle
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
security 관련해서 의존성 추가된 건 총 2개. 이건 타임리프 관련 스프링시큐리티
gradle에 이거 추가하고, 버튼이 2개에서 1개가 되었다.!!!!!!!!!
근데 디버깅 해보니 로그인한 유저들은 anonymousUser로, 결론은 인가는 되지않은 상태.
-> 로그인 여부와 무관하게 버튼은 1개 표출
+) 해결 내용
html
<span sec:authorize="isAuthenticated()" style="margin-right:7px">반갑습니다. <span sec:authentication="name"></span>님!</span>
<a class="btn btn-outline-info" sec:authorize="isAnonymous()" th:href="@{/login}">로그인</a>
<a class="btn btn-outline-info" sec:authorize="isAuthenticated()" href="/leave">로그아웃</a>
내 생각엔 타임리프 문법 자체는 크게 중요하지 않은듯
나는 jwt을 사용하여 springsecurity 를 썼는데 jwtFilter.java의 dofilter()에서 아래 코드를 누락해서, 인증받은 유저가 전혀없었다.
그렇기 때문에 항상 어나니머스유저였던것 ...바보 제일중요한 인가를 안했음...
SecurityContextHolder.getContext().setAuthentication(authentication);
'개발아닌개발 > springboot' 카테고리의 다른 글
[HTML/js + java] POST method 컨트롤러 (회원가입,로그인 등) (0) | 2023.08.07 |
---|---|
[thymeleaf] 문자열 비교 조건문 (th:if, th:text) (0) | 2023.07.31 |
[오류] Maria DB 한글 insert 안됨 인코딩변경방법(UTF-8) : Incorrect string value: '\xEC\x95\x88\x85\x95....' for column ~ (0) | 2023.05.24 |
라디오 설정값 가져와서 Class 속성 추가하기 (0) | 2022.01.12 |
타임리프(thymeleaf) 라디오 버튼의 초기값 설정하기 (0) | 2022.01.12 |
댓글