Очередной пост о решении типовой задачи самому себе на заметку. На этот раз при разработке портлета мне понадобилась информация о текущем пользователе - кто он такой, и какими ролями обладает. В зависимости от этого показываемая ему 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());
}
(...)