Заполнение модели на основе роли пользователя с помощью Spring MVC и Spring Security - PullRequest
1 голос
/ 22 апреля 2011

У меня проблема с заполнением содержимого модели в приложении Spring MVC на основе роли пользователя, управляемой Spring Security.

В моем приложении (упрощенный пример) у меня определены две роли: ROLE_USER и ROLE_ADMIN. Также у меня есть страница, которая отображает два отдельных списка объектов: читатели (доступны только для ADMIN) и книги (для ADMIN и USER).

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

Я думал об использовании Spring EL в коде Java для определения, указала ли пользователь роль (hasRole ('ROLE_ADMIN')), но я не могу найти способ вручную оценить этот код.

Есть ли способ вызвать обработчик Spring EL в исходном коде контроллера или, может быть, есть лучшее решение (на уровне архитектуры или на уровне шаблона проектирования) для условно заполненной модели, чем проверка ролей непосредственно в коде Java.

Ответы [ 3 ]

1 голос
/ 22 апреля 2011

Проблема была решена @Chepech и @Boris Kirzner в Запрет вызова метода без исключения с использованием аннотации @PreAuthorize . Таким образом, вы можете вернуть null (или пустой список в вашем случае) при возникновении AccessDeniedException.

0 голосов
/ 27 апреля 2011

Если условное отображение частей страницы контролируется страницей JSP, то контроллер должен выполнять условное заполнение модели (поскольку страница JSP и контроллер тесно связаны в слое представления).Если мы используем аннотации на сервисном уровне, это возложит ответственность на неправильный уровень приложения (на сервисном уровне вместо уровня представления).

Мое окончательное решение основано на запоминании набора пользовательских ролей в качестве атрибута пользовательского сеанса:

/* This is executed once, after user successful login. */

Set<String> roles = new HashSet<String>();
for (GrantedAuthority authority : authentication.getAuthorities()) {
   roles.add(authority.getAuthority());
}

session.setAttribute("userRoles", roles);

Тогда, если я хочу условно заполнить модель, мне нужно только проверить, содержится ли необходимая роль в этом наборе.

Set<String> roles = (Set<String>) session.getAttribute("userRoles");
if(roles.contains("ROLE_ADMIN")) {
    putReadersInModel(model);
}

Я думаю, что решение является чистым и сохраняетответственность за правильное заполнение модели в контроллере.

0 голосов
/ 22 апреля 2011

Один из подходов состоит в том, чтобы просто возвращать все, когда вы генерируете модель, а затем полагаться на @PostFilter для фильтрации этого результата по ролям.Если вы не хотите идти по этому пути, вы можете попросить свой контроллер вызвать другой компонент для создания определенных частей вашей модели, а этому другому компоненту могут быть прикреплены аннотации ролей.Это фактически ограничит вас от создания объектов, если они не будут использоваться.

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