2017-02-08 10 views
1

Я пытаюсь предоставить следующую модель для каждой страницы, чтобы я мог проверить, зарегистрирован ли текущий пользователь, и, следовательно, контролировать элементы меню заголовка для каждой страницы, но Я не хочу всегда возвращать индекс. Есть ли способ вернуть себя?Springboot/Thymeleaf проверяет текущего пользователя от модели на каждой странице

@RequestMapping(value = "/**", method = RequestMethod.GET) 
String index(Model model) { 
Users user = usersRepository.findOne(1 L); 

if (user != null) { 
    String currentRole = user.getRole().toString(); 
    model.addAttribute("currentRole", currentRole); 
    // System.out.println("Current Role: " + currentRole); 
} else { 
    model.addAttribute("currentRole", "ANONYMOUS"); 
} 

return "index"; 
} 

Мое меню:

<li th:switch="${currentRole}"> 
    <!-- Is Employee, so show "My Requests" --> 
    <div th:case="EMPLOYEE"> 
     <a href="#" th:href="@{/requests}"> 
     <div style="float: left; margin-right: 10px;">My Requests</div> 
     <!-- Handle notifications here --> 
     <div style="overflow: hidden" id="circle">1</div> 
     </a> 
    </div> 
    <!-- Is Manager, so show "My Approvals" --> 
    <div th:case="MANAGER"> 
     <a href="#" th:href="@{/requests}"> 
     <div style="float: left; margin-right: 10px;">My Approvals</div> 
     <!-- Handle notifications here --> 
     <div style="overflow: hidden" id="circle">1</div> 
     </a> 
    </div> 
</li> 
<li><a href="#" th:href="@{/team}">My Team</a></li> 
<!-- Is logged in, so don't show "Log In" --> 
<li th:unless="${currentRole}"> 
    <a href="/login" th:href="@{/login}" class="btn-login">Log In</a> 
</li> 
</ul> 

ответ

1

Как вы используете Spring вы можете создать @ControllerAdvice класс и поместить туда нужный логику, что-то вроде этого (не тестировалось)

@ControllerAdvice 
public class UserRoleAdvice { 

    // ... autowire needed services 

    @ModelAttribute("currentRole") 
    public String currentRole() { 
     Users user = usersRepository.findOne(1 L); 
     if (user != null) { 
      return user.getRole().toString(); 
     } else { 
      return "EMPLOYEE"; 
     } 
    } 
} 

Это добавит этот параметр для всех страниц ...

+0

Спасибо. Имеет ли значение, где я отношу этот класс к корню? – santafebound

+0

Вам просто нужно поместить этот класс в каталог, который находится под автосканированием, или просто вместе с контроллерами – Andremoniy

+0

Cool. Я сделаю это. – santafebound

2

Если вы используете Spring s ecurity, Thymeleaf имеет модуль интеграции, который имеет дело с этим непосредственно в ваших шаблонах, поэтому вам, вероятно, даже не нужно имя пользователя в модели. Добавьте зависимость к соответствующей версии org.thymeleaf.extras:thymeleaf-extras-springsecurity4.

Затем добавьте Xmlns вам HTML

<html xmlns:th="http://www.thymeleaf.org" 
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"> 

и вы можете сделать

<div th:text="${#authentication.name}"> 
    The value of the "name" property of the authentication object should appear here. 
</div> 

Подробнее о Spring Security Integration module

 Смежные вопросы

  • Нет связанных вопросов^_^