У меня есть фрагмент для моего веб-приложения, который используется на нескольких страницах для отображения панели навигации с пользователем, вошедшим в систему: если они вошли в систему, если нет: отобразить кнопку входа и регистрации.
Я хочучтобы знать, как включить мой атрибут вошедшего в систему пользователя во фрагмент, поскольку в настоящее время у меня есть атрибут вошедшего в систему пользователя, сопоставленный с каждым контроллером, отображающим веб-страницу, а не фрагмент.
Чтобы получить текущего зарегистрированного пользователя, я использую
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
model.addAttribute("loggedinuser", authentication.getName());
Однако это относится только к одному запросу на получение.Я хочу иметь возможность отображать зарегистрированного пользователя во фрагменте, который затем вызывается каждой страницей.
Вот пример контроллера, получающего зарегистрированного пользователя
@GetMapping(path= "")
public String getMainPage(HttpServletRequest request, Model model) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
model.addAttribute("loggedinuser", authentication.getName());
model.addAttribute("roles", authentication.getAuthorities());
return "mainpage";
}
Здесьмой класс, расширяющий WebSecurityConfigurerAdapter для аутентификации имени пользователя и пароля пользователя по одному в базе данных
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
String userbyUsernameQuery = "select username, password, '1' as enabled from auth_user where username=?;";
String rolebyUsernameQuery = "SELECT auth_user.username, auth_role.role_name as authority from auth_user\n" +
"INNER JOIN auth_user_role ON auth_user.auth_user_id = auth_user_role.auth_user_id\n" +
"INNER JOIN auth_role ON auth_role.auth_role_id = auth_user_role.auth_role_id\n" +
"WHERE auth_user.username =?";
auth.jdbcAuthentication()
.dataSource(dataSource)
.usersByUsernameQuery(userbyUsernameQuery)
.authoritiesByUsernameQuery(rolebyUsernameQuery)
.passwordEncoder(passwordEncoder());
}
Часть фрагмента navbarHeader, которую я хочу изменить, это
<ul class="nav navbar-nav navbar-right">
<li><a th:href="@{/registration}"><span class="glyphicon glyphicon-user"></span>Sign up</a></li>
<li><a th:href="@{/login}"><span class="glyphicon glyphicon-log-in"></span> Login</a></li>
</ul>
Я хочуотобразить зарегистрированного пользователя, если вошел в систему и отключить кнопку регистрации.Если нет, то отобразите кнопку входа и кнопку регистрации
Вот моя страница на главной странице, на которой отображается текущий пользователь, вошедший в систему, и роль, которую я хочу переместить во фрагмент, поэтому мне не нужно добавлять весь код вкаждый контроллер и html-страница.
<div align="right" id="loggedIn" th:if="${loggedinuser != null}">
<div style="margin: 10px"
th:text="'Logged in as: '+${loggedinuser} + ' Role: ' +${roles}">
</div>
</div>
класс пользователя
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{
private int id;
private String name;
private String lastName;
private String username;
private String password;
private String email;
private String enabled;
public User(String name, Collection<? extends GrantedAuthority> authorities) {
}
}