【问题标题】:Populating a Model based on User Role with Spring MVC and Spring Security使用 Spring MVC 和 Spring Security 填充基于用户角色的模型
【发布时间】:2011-08-11 03:31:17
【问题描述】:

根据 Spring Security 管理的用户角色,我在 Spring MVC 应用程序中填充模型内容时遇到问题。

在我的应用程序(简化示例)中,我定义了两个角色:ROLE_USER 和 ROLE_ADMIN。此外,我还有一个页面显示两个单独的对象列表:读者(仅适用于 ADMIN)和书籍(适用于 ADMIN 和 USER)。

在JSP Page中条件显示列表没有问题,但是我需要先准备模型,如果当前用户不是ADMIN,我不想加载读者列表。

我曾考虑在 Java 代码中使用 Spring EL 来确定用户是否具有指定角色 (hasRole('ROLE_ADMIN')),但我找不到手动评估该代码的方法。

有没有办法在控制器源代码中调用 Spring EL 处理程序,或者有更好的解决方案(在架构或设计模式级别)用于有条件地填充模型,而不是直接在 Java 代码中检查角色。

【问题讨论】:

    标签: java security spring-mvc spring-security


    【解决方案1】:

    @Chepech 和@Boris Kirzner 在Prevent Method call without Exception using @PreAuthorize Annotation 中解决了这个问题。这样,当 AccessDeniedException 发生时,您可以返回 null(或在您的情况下为空列表)。

    【讨论】:

      【解决方案2】:

      一种方法是在生成模型时只返回所有内容,然后依靠@PostFilter 根据角色过滤结果。如果你不想走那条路,你可以让你的控制器调用另一个 bean 来构建模型的特定部分,而另一个 bean 可以附加角色注释。如果它们不会被使用,这将有效地限制您创建对象。

      【讨论】:

      • 感谢您的建议。不幸的是,您的两个解决方案都有缺陷,首先是性能方面的问题,其次是对带注释的方法的调用将导致安全异常,这不是控制程序流的最清晰方法。尽管它们都可以提供所需的效果,但我正在寻找更清洁的解决方案。
      • 我认为如果用户没有正确的权限会导致方法返回一个预定义的值(在我的情况下是一个空列表)而不执行该方法主体,这将是很好的。但这只是一厢情愿;)
      【解决方案3】:

      如果页面部分的条件显示是由 JSP 页面控制的,那么模型的条件填充应该由控制器来完成(因为 JSP 页面和控制器在视图层中是紧密耦合的)。 如果我们在服务层使用注解,它会将责任放在应用程序的错误层(在服务层而不是视图层)。

      我的最终解决方案是基于记住一组用户角色作为用户会话属性:

      /* This is executed once, after user successful login. */
      
      Set<String> roles = new HashSet<String>();
      for (GrantedAuthority authority : authentication.getAuthorities()) {
         roles.add(authority.getAuthority());
      }
      
      session.setAttribute("userRoles", roles);
      

      然后,如果我想有条件地填充模型,我只需要检查所需的角色是否包含在该 Set 中。

      Set<String> roles = (Set<String>) session.getAttribute("userRoles");
      if(roles.contains("ROLE_ADMIN")) {
          putReadersInModel(model);
      }
      

      我认为该解决方案是干净的,并且负责在 Controller 中正确填充模型。

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 2020-12-18
        • 1970-01-01
        • 2020-06-16
        • 1970-01-01
        • 2019-08-08
        • 2021-02-15
        • 2017-10-19
        相关资源
        最近更新 更多