【问题标题】:Is there a way to bypass all security checks in Spring Security?有没有办法绕过 Spring Security 中的所有安全检查?
【发布时间】:2018-05-13 02:07:36
【问题描述】:

我来自 PHP 世界。我使用最多的框架是 Symfony,它很大程度上基于 Spring 的思想。如果其名为 JMSSecurityExtraBundle 的捆绑包支持角色ROLE_IDDQD,您可以通过configuration 激活该角色。使用该角色进行身份验证将有效地绕过所有安全检查——无论是那些 Web 安全约束或直接对域层中类的方法的约束。

由于与安全相关的测试需要对具有特定角色的用户进行身份验证,因此我将以编程方式创建身份验证对象并将其传递给安全上下文来对用户进行身份验证。这样我就可以直接在域代码上测试安全约束,而不涉及任何 UI。

由于很多域方法都是安全的,它会阻止我为某些测试设置固定装置,因为当前经过身份验证的用户没有足够的权限来执行此操作。这就是我开始使用ROLE_IDDQD 的地方——我创建了一个方法,该方法将采用一个可以绕过任何安全约束在域层中执行任何操作的函数:

$user = $this->iddqd(function () {
    return $this->userManager->save($this->aUser());
});

该方法会记住当前的认证,用ROLE_IDDQD重新认证,执行传入的函数,然后恢复记住的认证。

我正在将应用程序迁移到 Spring 并寻找一种方法来使用 Spring 做同样的事情。我找不到任何提及ROLE_IDDQD,所以我猜这部分不是基于 Spring Security。还有其他方法可以复制此功能吗?

【问题讨论】:

    标签: spring spring-security


    【解决方案1】:

    Spring security 有一个匿名用户的概念,自动分配角色“ROLE_ANONYMOUS”。您可以查找更多信息here

    【讨论】:

    • 系统的所有用户都必须经过认证,所以这里不适用匿名角色。
    • 因此您需要某种机制来动态添加角色并测试您的域,然后将这些角色重置为最低权限的角色。对吧?
    • 我想要一种方法来绕过对需要特定角色的方法的安全检查,即使当前登录的用户没有该角色。我只需要这个来进行测试。而且我不在乎这是使用角色还是存在其他方式。
    【解决方案2】:

    我很久以前就解决了这个问题。以下是我的做法。

    在我的架构中,我通常有一个用于抽象数据库访问的存储库层和一个执行域逻辑的存储库层之上的管理器层。

    问题在于我的测试方法。我尝试使用管理器来设置测试数据。我现在直接使用存储库来做这件事,不需要像 IDDQD 角色之类的黑客攻击。

    因此,基本上,我使用存储库将测试数据填充到数据库中,然后我点击管理器来测试其中的域逻辑。

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2018-11-01
      相关资源
      最近更新 更多