null

Liferay - получение ID и списка ролей текущего пользователя

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

JSP-страница

Получение текущего пользователя на JSP-странице портлета не представляет никакой проблемы, если вначале этой страницы указать тег <portlet:defineObjects />. В этом случае нам будет доступен объект user, содержащий в себе всю необходимую информацию о пользователе портала:

<portlet:defineObjects />

<h1>Current user id is <%= user.getUserId() %></h1>
<p>Hello, <%= user.getFirstName() + " " + user.getLastName() %>!</p>

Проверяем полученный результат на портале:

Всё работает - видны идентификатор пользователя и приветствие.

Получить аналогичным образом список ролей пользователя тоже не представляет никакой проблемы:

<p>Current user's roles:</p>
<p>
    <% 
        List<Role> roles = (List<Role>) RoleServiceUtil.getUserRoles(user.getUserId());
        for (Role role : roles) {
            out.println(role.getName() +"###"+ role.getRoleId() + "<br/>");
        }
    %>
</p>

Смотрим на портале, что у нас получилось:

Появился список ролей текущего пользователя.

Если нам не нужно знать полный список ролей, а хочется просто проверить, является ли пользователь администратором, то код такой проверки может выглядеть ещё проще:

<p>
    You are 
    <%= permissionChecker.isOmniadmin() ? "almighty administrator" : "state user" %>
</p>

Проверяем, работает проверка, или нет:

"Простая" проверка на наличие роли администратора тоже работает.

Портлет

В портлете всё ненамного сложнее - единственная проблема в том, что тег <portlet:defineObjects /> на него никак не влияет, так что воспользоваться неявно заданными объектами не получится. Вместо них нас выручит замечательный объект ThemeDisplay, который можно получить из ActionRequest'а:

(...)
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
PermissionChecker permissionChecker = themeDisplay.getPermissionChecker();
User user = themeDisplay.getUser();
(...)

После этого полученными объектами user и permissionChecker можно пользоваться по аналогии с неявно заданными на JSP-странице - например, в зависимости от наличия роли администратора формировать разные запросы к базе данных:

(...)
List<Competition> competitions;
if (permissionChecker.isOmniadmin()) {
    competitions = competitionBean.findAllCompetitions();
} else {
    competitions = competitionBean.findUserCompetitions(user.getUserId());
}
(...)

 

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.

Ничего не найдено. n is 0