【问题标题】:Conditionally Render In JSP By User有条件地在 JSP 中按用户呈现
【发布时间】:2010-10-30 10:58:24
【问题描述】:

我正在尝试创建一个简单的论坛,只是为了掌握 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 标记按用户进行过滤,或者我是否需要以不同的方式进行此操作。

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

【问题讨论】:

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


【解决方案1】:

假设您有一个位于此页面后面的控制器,我只需在 ModelAndView 中添加一个 canEditPost 字段,看起来类似于(半伪代码):

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。

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

【讨论】:

    【解决方案2】:

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

    如果是这样,您可以简单地检查Author 是否与当前用户相同(您将有两组标签)。

    【讨论】:

    • 这可行,但理想情况下我想在 Spring Security 框架的范围内找到一种方法。
    【解决方案3】:

    你可以有条件

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

    【讨论】:

    • 是的,我知道。正如我对@TM 提到的,我想在 Spring Security 框架的范围内找到一种方法,最好不使用脚本(即 )
    【解决方案4】:

    @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 object Security 部分的链接现在已断开)的 Domain Object Security 部分中找到)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 2021-04-18
      • 2021-02-08
      • 2014-02-28
      • 2019-08-02
      相关资源
      最近更新 更多