1
38
问题在于,Spring安全性并不能使身份验证对象作为bean在容器中可用,因此无法轻松地将其注入或自动连接到框中。 在开始使用Spring安全性之前,我们将在容器中创建一个会话范围的bean来存储主体,将其注入到“authenticationservice”(singleton)中,然后将此bean注入到需要了解当前主体的其他服务中。 如果您正在实现自己的身份验证服务,那么基本上可以做相同的事情:创建一个具有“主体”属性的会话范围bean,将其注入到您的身份验证服务中,让auth服务将该属性设置为成功的auth,然后根据需要将auth服务提供给其他bean。 使用SecurityContextHolder我不会感到太糟糕。不过。我知道它是一个静态的/单例的,Spring不鼓励使用这些东西,但是它们的实现会根据环境的不同而采取适当的行为:servlet容器中的会话范围、JUnit测试中的线程范围等等。单例的真正限制因素是它提供了一个不灵活的实现。不同的环境。 |
2
120
只需按常规方式进行,然后使用
控制器:
测试:
|
3
27
您应该关注的是非常正确的——静态方法调用对于单元测试尤其有问题,因为您不能轻易地模拟您的依赖性。我要向您展示的是如何让SpringIOC容器为您完成这些脏工作,从而为您留下整洁、可测试的代码。SecurityContextHolder是一个框架类,虽然您的低级安全代码可以绑定到它,但您可能希望向UI组件(即控制器)公开更整洁的接口。 cliff.meyers提到了一种解决方法——创建自己的“主体”类型,并向消费者注入一个实例。春天& lt; aop:scoped-proxy />2.x中引入的标签与请求范围bean定义结合在一起,工厂方法支持可能是最可读代码的通行证。 它的工作原理如下:
到目前为止还没什么复杂的,对吧?事实上,你可能已经完成了大部分工作。接下来,在bean上下文中定义一个请求范围的bean来保存主体:
由于aop:scoped代理标记的魔力,每次新的HTTP请求出现时都将调用静态方法getUserDetails,并且对currentUser属性的任何引用都将得到正确的解析。现在单元测试变得微不足道:
希望这有帮助! |
4
18
在不回答如何创建和注入身份验证对象的问题的情况下,SpringSecurity4.0在测试方面提供了一些受欢迎的替代方案。这个
也可以选择使用
有关更多详细信息,请参见 @WithMockUser 以及 @WithUserDetails Spring安全参考文档中的章节(从中复制上述示例) |
5
8
我个人只会使用powermock和mock i to或easymock来模拟单元/集成测试中的静态SecurityContextHolder.getSecurityContext(),例如。
诚然,这里有相当多的样板代码,例如模拟身份验证对象、模拟SecurityContext以返回身份验证,最后模拟SecurityContextHolder以获取SecurityContext,但是它非常灵活,允许您对场景(如空身份验证对象等)进行单元测试,而不必更改y。我们的(非测试)代码 |
6
5
在这种情况下,使用静态代码是编写安全代码的最佳方法。 是的,静态通常是坏的-一般来说,但是在这种情况下,静态是您想要的。由于安全上下文将主体与当前运行的线程关联,因此最安全的代码将尽可能直接从线程访问静态。隐藏注入的包装类后面的访问为攻击者提供了更多的攻击点。他们不需要访问代码(如果jar被签名,他们很难更改代码),他们只需要一种方法来覆盖配置,可以在运行时完成,也可以将一些XML放到类路径上。即使使用注释注入,也可以用外部XML覆盖。这种XML可以向正在运行的系统注入一个恶意主体。 |
7
3
我自己也问过同样的问题
here
刚刚发布了一个我最近找到的答案。简短的回答是:注入
|
8
2
我将看一下Spring的抽象测试类和模拟对象。 here . 它们提供了一种强大的自动连接Spring管理的对象的方法,使单元和集成测试更加容易。 |
9
2
一般同时(从3.2版开始,在2013年,由于 SEC-2298 )可以使用注释将身份验证注入到MVC方法中 @AuthenticationPrincipal :
测验
在单元测试中,显然可以直接调用这个方法。在集成测试中使用
但是,这将直接填充SecurityContext。如果要确保用户是从测试中的会话加载的,可以使用此选项:
|
10
1
身份验证是服务器环境中线程的属性,与操作系统中进程的属性相同。拥有一个用于访问身份验证信息的bean实例将不方便配置和连接开销,而且没有任何好处。
关于测试认证,有几种方法可以让您的生活更轻松。我最喜欢做一个自定义注释
|
11
0
经过相当多的工作,我能够重现所期望的行为。我已经通过mockmvc模拟了登录。对于大多数单元测试来说,它太重了,但对集成测试很有帮助。 当然,我愿意在SpringSecurity4.0中看到那些新特性,它们将使我们的测试更加容易。
|
Vickie Jack · spring无法发送css和js资源 6 年前 |
Laures · 将角色层次结构应用于客户端角色 6 年前 |
Ayush · 无法为第二次命中调用身份验证提供程序 6 年前 |