用户在JSP中有条件地渲染

时间:2009-06-01 16:47:03

标签: java spring jsp spring-mvc spring-security

我正在尝试创建一个简单的论坛,以获得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 个答案:

答案 0 :(得分: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。

视图通常更好地引用模型中的简单标志而不是视图/模板执行实际逻辑。

答案 1 :(得分:0)

您的Author对象是否以每个作者都是唯一的方式实现equals

如果是这样,您只需检查Author是否与当前用户相同(您有两组标签)。

答案 2 :(得分:0)

@matt b的答案是一个很好的方法,可能是我最终会做的。但我发现另一种方法有点复杂,但会实现我在这篇文章中的内容。

我做了一些阅读,发现你可以在域对象级别处理安全性,并且基本上为角色或任意对象提供读/写/删除权限,例如,当前用户ID。在这个例子中,我会给当前用户id访问域对象,在这种情况下是一个ForumPost对象,它有自己的数据库唯一id。

然后,当前用户id将被授予读写访问权限,这可以(通过XML配置)被定义为各种自定义角色(我相信正确的术语实际上是Voter)。然后,我可以将此选民命名为 MESSAGE__EDIT

因此,在我的JSP中,我可以使用以下内容:

安全:授权ifAnyGranted =“MESSAGE_EDIT”

它会(再次通过XML配置)获取当前用户ID并根据当前域对象(在本例中为ForumPost对象)提供访问权限。

这比听起来要多得多,但绝对可以做到。

有关所有这些内容的一些文档可以在Spring Security Reference Documentation(http://static.springframework.org/spring-security/site/reference/html/springsecurity.html中的域对象安全性部分中找到(由于某种原因,现在已经断开了Domain objects Security部分的链接)。) p>

答案 3 :(得分:0)

你可以有条件

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