오늘 관리자 화면 버튼을 유저가 관리자 권한을 가졌을 때만 나타나게끔 만들기로 했다.
하지만 mustache에는 Thymeleaf처럼 아래와 같은 로직을 구현하는 사용할 수 있는 방도를 찾진 못했다.
<a
class="nav-link active"
sec:authorize="hasAnyRole('ROLE_USER')"
th:href="@{/note}"
>
github에 mustache로 spring security 관련 코드를 찾아봤다.
해당 정보는 찾았지만 해당 코드를 사용하기 위해서는 maven 기반 프로젝트여야 했다. 나의 경우 gradle 기반이기 때문에 임포트 하는 방법에서 방법을 찾기 힘들었다.
그래서 다른 방식으로 권한을 체크하게 되었다.
@GetMapping("/")
public String main(Model model, @LoginUser SessionUser user, @AuthenticationPrincipal User user_s) {
checkUser(model, user, user_s);
return "main";
}
static public void checkUser(Model model, SessionUser user, User user_s){
if (user != null) {
model.addAttribute("nickname", user.getName());
if(user.getRole().getKey().equals("ROLE_ADMIN"))
model.addAttribute("isAdmin", user.getRole().getKey());
}
if (user_s != null) {
model.addAttribute("nickname", user_s.getName());
if(user.getRole().getKey().equals("ROLE_ADMIN"))
model.addAttribute("isAdmin", user_s.getRole().getKey());
}
}
나의 경우 위와같은 방식으로 문제를 해결하였다.
컨트롤러가 호출될때 유저 권한을 받아서 만약 ADMIN 권한을 가졌다면 isAdmin이라는 값을 model에 넣는 것이다.
그렇게 하여 mustahce에서는 아래와 같이 구현하였다.
{{#isAdmin}}
<!-- Nav Item - Tables -->
<li class="nav-item" sec:authorize="hasRole('ROLE_ADMIN')">
<a class="nav-link" href="tables.html">
<i class="fas fa-fw fa-table"></i>
<span>관리자 화면</span></a>
</li>
{{/isAdmin}}
관리자의 권한을 가졌다면 자연스럽게 관리자 화면 버튼 클릭 버튼이 생성될 것이고 아니라면 생성되지 않을 것이다.