Условно визуализировать в JSP пользователем - PullRequest
2 голосов
/ 01 июня 2009

Я пытаюсь создать простой форум, чтобы познакомиться с платформами Spring Security и MVC.

Для простоты, у меня есть JSP для просмотра поста на форуме, который выглядит следующим образом:

<body>
    ...

    Title: ${forumPost.title} <br>
    Author: ${forumPost.author.name} <br>
    Message: {forumPost.message} <br>

    <security:authorize ifAnyGranted="ROLE_ADMIN">
        Edit: <a href="/edit">Edit</a>
    </security:authorize>

    ...
</body>

Моя проблема: не только администратор должен иметь возможность редактировать это сообщение, но также должен иметь возможность и оригинальный автор. Поэтому я хочу, чтобы только ROLE_ADMIN и первоначальный автор могли видеть ссылку «Изменить». Однако я не уверен, как фильтровать по пользователю с помощью security: authorize тэг, или мне нужно будет пойти по-другому.

Любые предложения будут высоко оценены. Спасибо!

Ответы [ 4 ]

3 голосов
/ 01 июня 2009

Предполагая, что у вас есть контроллер, расположенный за этой страницей, я бы просто добавил поле canEditPost к ModelAndView, которое выглядит примерно так (полупсевдокод):

private boolean isAdmin() {
    Authentication currentAuthObj = SecurityContextHolder.getContext().getAuthentication();
    List<GrantedAuthority> authorities = Arrays.asList(currentAuthObj.getAuthorites());
    for (GrantedAuthority auth : authorities) {
        if ("ROLE_ADMIN".equals(auth.getAuthority())) {
            return true;
        }
    }
    return false;
}

boolean currentUserIsAuthor = ...;

modelAndView.addObject("canEditPost", 
    Boolean.valueOf(currentUserIsAuthor || isAdmin());

А потом, на ваш взгляд, просто ссылка $ canEditPost.

Обычно для представления лучше просто ссылаться на простой флаг в модели, чем для представления / шаблона, выполняющего фактическую логику.

0 голосов
/ 01 июня 2009

Вы можете иметь условия

<% if(mycondition.isTrue()){ %>
<security:authorize ifAnyGranted="ROLE_ADMIN">
    Edit: <a href="/edit">Edit</a>
</security:author
<% }%>
0 голосов
/ 01 июня 2009

@ ответ Мэтта Б - отличный способ сделать это, и, вероятно, это то, что я в конечном итоге сделаю. Но я нашел другой способ, который немного сложнее, но достигнет того, что я изложил в этом посте.

Я немного прочитал и обнаружил, что вы можете управлять безопасностью на уровне объекта домена и, по сути, дать привилегии чтения / записи / удаления роли или произвольному объекту, например, текущему идентификатору пользователя. В этом примере я бы дал текущему пользователю идентификатор доступа к объекту домена, в этом случае объект ForumPost, который имеет свой уникальный идентификатор из базы данных.

Текущему идентификатору пользователя будет предоставлен доступ на чтение и запись, который (через конфигурацию XML) может быть определен как своего рода роль (я полагаю, что на самом деле правильным термином является Voter). Тогда я мог бы назвать этого избирателя MESSAGE__EDIT .

Итак, в моем JSP я мог бы использовать следующее:

безопасность: авторизовать ifAnyGranted = "MESSAGE_EDIT"

И он (опять же, через конфигурацию XML) получит текущий идентификатор пользователя и предоставит доступ на основе текущего объекта домена, в данном случае объекта ForumPost.

Это немного больше работы, чем кажется, но это определенно можно сделать.

Некоторая документация по всем этим вопросам содержится в разделе «Безопасность объекта домена» в Справочной документации по безопасности Spring (http://static.springframework.org/spring-security/site/reference/html/springsecurity.html (по какой-то причине ссылка на раздел «Безопасность объекта домена» на данный момент не работает)).

0 голосов
/ 01 июня 2009

Ваш объект Author реализует equals таким образом, что каждый автор уникален?

Если это так, вы можете просто проверить, совпадает ли Author с текущим пользователем (у вас будет два набора тегов).

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