我正在尝试创建一个简单的论坛,以获得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 标记来过滤用户,或者如果我需要以不同的方式进行此操作。
我们非常感谢任何建议。谢谢!
答案 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
<% }%>