在Spring Security中使用PreAuthorize注释中的permitAll()的目的

问题描述 投票:2回答:2

作为Spring安全框架的新手,我想知道为什么我们使用@PreAuthorize("permitAll()")方法?文档说permitAll总是评估为true。 (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
2个回答
6
投票

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

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

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

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


2
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.