【问题标题】:Using both CRUD and Secure module in Play Framework在 Play Framework 中同时使用 CRUD 和 Secure 模块
【发布时间】:2023-03-26 16:35:01
【问题描述】:

我想知道如何在不保护整个控制器的情况下将 CRUD 与 Secure 模块一起使用。

我有一个带有名为 BlogPosts 的控制器的 BlogPost 模型。由于我希望管理员能够使用 CRUD 后台来创建、更新和删除帖子,因此控制器扩展了 CRUD 并使用 Secure :

@With(Secure.class)
public class BlogPosts extends CRUD {

}

但现在我想在主页上列出博客文章。我不能使用这个控制器,因为它仅限于经过身份验证的用户。而且我不想创建另一个控制器。

那么最好的方法是什么?

【问题讨论】:

    标签: java model-view-controller playframework


    【解决方案1】:

    您可以编写自己的@Before 方法来调用除list 之外的所有方法的安全检查。比如:

       @Before(unless="list")
       public static void before() {
          // Do security check
       }
    

    它不会像注释那样方便,但它会起作用。

    documentation

    编辑评论以澄清

    我看到答案有点模棱两可。这个想法是删除@With() 注释并创建您自己的本地@Before 方法,该方法将在所有方法除了list 上执行。然后该方法可以将处理委托给 Secure.before(因为它是一个没有参数的静态方法)

    现在我想了想,你可以在Secure 类中的方法中添加unless 限制,它应该适用于这种情况,尽管这意味着混合一些概念(所以我不会在我的项目中这样做)。

    【讨论】:

    • 所以你只是绕过了安全模块?如果没有 @With(Secure.class) 注释,如何调用安全检查?以及如何处理对 CRUD 后台的身份验证?
    【解决方案2】:

    只需在您的其他控制器中通过 JPA 获取 BlogPost 项目:

    public static void listBlogs() {
        render(BlogPost.findAll());
    }
    

    【讨论】:

    • 那么您建议创建另一个控制器,我认为这将是 BlogPosts 的副本。你会怎么命名它?另一种解决方案是将其放在应用程序控制器中。
    • 您好,您不需要创建特定的控制器来检索博客文章列表。正如 BlogPost.findAll() 所建议的,它已经被实体 BlogPost 中超类 Model 的继承所覆盖。
    • 是的,使用另一个控制器。 BlogPosts 类只能用于管理 UI。
    • 所以我必须复制管理所需的所有控制器?这对我来说听起来很脏。 @WiseTechi 我说的是您将方法 listBlogs() 放入的控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多