【问题标题】:Purpose of using permitAll() in PreAuthorize annotation in Spring Security在 Spring Security 的 PreAuthorize 注解中使用 permitAll() 的目的
【发布时间】:2015-09-12 14:26:41
【问题描述】:

作为 Spring 安全框架的新手,我想知道为什么我们将 @PreAuthorize("permitAll()") 与方法一起使用?文档说 permitAll 总是评估为真。 (http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html)

另外,我有以下代码更改。开发人员从 permitAll() 更改为特定权限检查。这里的含义是什么?由于我不太确定 permitAll() 的工作原理,因此我无法判断代码更改背后的逻辑。在我看来,开发人员添加了特定的权限检查,并且他将 null 作为身份验证对象传递。有人可以解释显式传递 null 作为身份验证对象有什么影响吗?如果未经身份验证的用户对目标对象具有此特定的“LUONTI”权限-“opetussuunnitelma”,他们是否可以访问?

-    @PreAuthorize("permitAll()")
+    @PreAuthorize("hasPermission(null, 'opetussuunnitelma', 'LUONTI')")
     OpetussuunnitelmaDto addOpetussuunnitelma(OpetussuunnitelmaDto opetussuunnitelmaDto);

谢谢。非常感谢任何帮助!

【问题讨论】:

    标签: java security spring-security annotations spring-annotations


    【解决方案1】:

    permitAll() 完全按照它所说的去做。它允许(允许)任何用户的(所有)会话被授权执行该方法。

    spring 管理其身份验证和授权的方式意味着访问您网站的任何人都将获得一个会话。此会话可以是匿名的,也可以是经过身份验证的(用户提供了某种凭据并且系统已接受它)。 permitAll(例如hasPermission())的替代方案通常会检查用户的身份验证,以确保在允许调用带注释的类/方法之前为他们分配了一些角色或组。

    如果使用permitAll(),则表示明确允许任何会话(匿名或经过身份验证)访问带注释的方法。

    其他开发人员所做的代码更改已将给定方法限制为自定义方法。看看这个Spring - Expression-Based Access Control

    【讨论】:

    • 如果 permitAll() 允许所有内容,则与没有任何注释检查一样好。那么,为什么有人首先要使用它呢?
    • 另外,我对上述代码中使用 null 的解释是否正确?
    • 我不知道为什么你的代码一开始就有它,但它可能实际上与没有注释不同。 Spring 级联 @PreAuthorize 注释,因为它们也适用于类。如果@PreAuthorize 注释在类上,然后方法上没有任何内容,则该方法继承类@PreAuthorize。他也可以出于明确的目的这样做(“任何用户都可以使用潜在的访问权限,不要返回任何敏感信息”)
    • 可能默认模式不是“permitAll”,这就是为什么您必须使用注释明确提及它的原因。我正在寻找一些具体的推理。
    • 如果无法查看您的整个弹簧配置,几乎不可能为您提供具体的理由。使用 null 意味着用于 hasPermission() 调用的 PermissionEvaluator 的实现不关心任何 Authentication 对象(也许它每次都将其从会话中拉出)。不幸的是,除了这个方法签名之外,很难给出明确的推理。
    【解决方案2】:

    我觉得没有人真正给你你真正想要的东西,这是“permitAll()”的一个用例。

    当您使用特定权限限制整个班级或应用程序时可以使用它,例如: @PreAuthorize("hasAuthority('USER')")

    在这里,只有标识为您定义为用户的客户端才能访问您的类的方法。

    但是在您的控制器中的某个时刻,您希望某个方法是无权限的,因此您需要将 @PreAuthorize("permitAll()") 添加到您的方法中,以便它覆盖全局权限。

    人们会这样做,因为首先使用最高权限锁保护所有内容,然后在网络上戳漏洞(例如,应用程序/类被锁定为 ADMIN,但大多数方法随后被授权给 USER)比其他方式更安全大约。因为如果默认情况下所有东西都是解锁的,那么在您忘记锁定控制器的那一天,您可能会遇到安全问题。

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 2016-07-18
      • 2013-01-11
      • 2021-06-28
      • 2019-03-10
      • 2013-08-14
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多