在Spring Security

时间:2015-06-25 19:50:36

标签: java security spring-security annotations 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);

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

2 个答案:

答案 0 :(得分:6)

permitAll()正如它所说的那样。它允许(允许)任何用户(所有)会话被授权执行该方法。

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

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

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

答案 1 :(得分:2)

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

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

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

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

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