2009-06-01 4 views
2

Я пытаюсь создать простой форум, чтобы получить поддержку Spring Security и MVC.Условно Render In JSP По пользователю

Для простоты, давайте я быть_наст 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 и оригинальный автор могли видеть ссылку «Изменить». Однако я не уверен, как фильтровать пользователь с помощью безопасности : авторизуйте тег, или если мне нужно будет поступить по этому другому пути.

Любые предложения были бы очень признательны. Благодаря!

+0

Я хотел бы добавить, что я смотрел на весенней справочную безопасности Документации (http://static.springframework.org/spring-security/site/reference/html/springsecurity.html), и похоже, что у него ничего не было, или даже документация тега . –

ответ

3

Если предположить, что у вас есть контроллер, который находится позади этой страницы, я бы просто добавить 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

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

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

+0

Это сработает, но в идеале я хотел бы найти способ сделать это в рамках среды Spring Security. –

0

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

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

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

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

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

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

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

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

0

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

<% if(mycondition.isTrue()){ %> 
<security:authorize ifAnyGranted="ROLE_ADMIN"> 
    Edit: <a href="/edit">Edit</a> 
</security:author 
<% }%> 
+0

Да, я знаю. Как я уже упоминал @TM, я хотел бы найти способ сделать это в рамках среды Spring Security, предпочтительно без использования скриптлетов (т. Е. <% %>) –