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

Zac*_*ack 2 java security annotations spring-security spring-annotations

作为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);
Run Code Online (Sandbox Code Playgroud)

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

Jem*_*mox 13

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

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

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

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

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


Dav*_*ugg 6

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

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

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

其他开发人员所做的代码更改已将给定方法限制为自定义.看看这个Spring - 基于表达式的访问控制

  • 我不确定为什么你的代码在那里开始,但它_may_实际上不同于没有注释.Spring级联了`@ PreAuthorize`注释,因为它们也适用于类.如果类上有一个`@ PreAuthorize`注释,然后该方法没有任何内容,则该方法继承类`@ PreAuthorize`.他本可以明确地做到这一点("任何用户都可以使用它,不要返回任何敏感信息") (2认同)