有条件地在JSP中由用户渲染


问题内容

我正在尝试建立一个简单的论坛,以期摆脱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 标签按用户进行过滤,或者是否需要以其他方式进行处理。

任何建议将不胜感激。谢谢!


问题答案:

假设您在此页面的后面有一个控制器,我只需在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。

通常,视图只引用模型中的一个简单标志比使视图/模板执行实际逻辑要好。