在 Spring 安全性的 PreAuthorize 注释中使用 permitAll() 的目的

Purpose of using permitAll() in PreAuthorize annotation in Spring Security

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

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

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

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

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

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

如果使用permitAll(),则意味着明确允许任何会话,无论是匿名的还是经过身份验证的,都可以访问注释的方法。

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

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

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

在这里,只有被标识为您定义为用户的客户端才能访问您的 class.

的方法

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

人们会这样做,因为首先使用最高权限锁保护所有内容然后在网络上戳洞更安全(例如,application/class 被锁定为 ADMIN,但大多数方法随后被授权给 USER)而不是相反。因为如果默认情况下一切都已解锁,那么当您忘记锁定控制器的那一天,您可能会遇到安全问题。