#spring #spring-boot #spring-security #thymeleaf
#spring #spring-загрузка #spring-безопасность #thymeleaf
Вопрос:
Я борюсь со следующим. У меня есть панель навигации, и я хочу показывать / скрывать определенный контент в зависимости от того, является ли пользователь анонимным / role_user / role_admin. Вот мой html:
<html lang="en" xmlns:th="http://www.thymeleaf.org xmlns:sec="http://www.w3.org/1999/xhtml">
<head>
<title>Beer Tag Home</title>
</head>
<body>
<nav class="navbar" role="navigation" id="mainNav">
<div class="container">
<a class="navbar-brand">Foo App</a>
<div class="navbar-collapse">
<ul class="navbar-nav">
<li class="nav-item"><a About</li>
<li class="nav-item">FAQ</li>
<div class="row" th:if="not${#authentication.isAuthenticated()}">
//this here will not even let spring boot up the app
<li class="nav-item">LOGIN</li>
</div>
<div class="row" <div th:if="${#httpServletRequest.isUserInRole('ROLE_USER')}">
<li class="nav-item">USER PANEL</li>
</div>
</ul>
</div>
</div>
</nav>
По сути, я хочу посмотреть, является ли пользователь анонимным, если это так, он может только войти в систему. Если пользователь вошел в систему, он может получить доступ к другому контенту на странице. Вот также мои зависимости от gradle:
скомпилировать(«org.springframework.boot:spring-boot-devtools»)
compile 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compile group: 'org.thymeleaf', name: 'thymeleaf', version: '3.0.11.RELEASE'
compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity4', version: '3.0.4.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
Я прочитал почти все сообщения на SO по этому вопросу, но ни одно из них не дает окончательного ответа.
Спасибо.
Ответ №1:
Чтобы отобразить блок только для анонимных:
<div th:if="!${#request.userPrincipal}">
<!-- content for anonymous -->
</div>
Комментарии:
1. Работает как по волшебству. Спасибо! 🙂
Ответ №2:
Также есть хороший модуль thymeleaf extras:https://github.com/thymeleaf/thymeleaf-extras-springsecurity
После добавления вы можете использовать его следующим образом:
<div sec:authorize="isAuthenticated()">
This content is only shown to authenticated users.
</div>
<div sec:authorize="hasRole('ROLE_ADMIN')">
This content is only shown to administrators.
</div>
<div sec:authorize="hasRole('ROLE_USER')">
This content is only shown to users.
</div>
Комментарии:
1. Я пытался. Похоже, что он не распознает атрибут sec: authorize и просто показывает все. Тем не менее, спасибо!