有条件地在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。
通常,视图只引用模型中的一个简单标志比使视图/模板执行实际逻辑要好。