Отображение имени пользователя, вошедшего в систему с использованием заголовка фрагмента тимилифа в загрузочном приложении Spring - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть фрагмент для моего веб-приложения, который используется на нескольких страницах для отображения панели навигации с пользователем, вошедшим в систему: если они вошли в систему, если нет: отобразить кнопку входа и регистрации.

Я хочучтобы знать, как включить мой атрибут вошедшего в систему пользователя во фрагмент, поскольку в настоящее время у меня есть атрибут вошедшего в систему пользователя, сопоставленный с каждым контроллером, отображающим веб-страницу, а не фрагмент.

Чтобы получить текущего зарегистрированного пользователя, я использую

        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) {
    }
}

1 Ответ

1 голос
/ 25 сентября 2019

Для этой проблемы я в основном использую ModelAttribute, который будет доступен во всей компиляции презентации.Итак, ваш контроллер хотел бы, чтобы

public class MyController {

    @GetMapping(path= "hi")
    public String getMainPage(HttpServletRequest request, Model model) {
        return "mainpage";
    }

    @GetMapping(path= "hello")
    public String getMainPage(HttpServletRequest request, Model model) {
        return "helloPage";
    }

    @ModelAttribute("loggedinuser")
    public User globalUserObject() {
        // Add all null check and authentication check before using. Because this is global 
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        model.addAttribute("loggedinuser", authentication.getName());
        model.addAttribute("roles", authentication.getAuthorities());
        // Create User pojo class
        User user = new User(authentication.getName(), Arrays.asList(authentication.getAuthorities()))
        return user;
    }
}

Теперь объект loggedinuser доступен для всех страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...