如何在不使用SecurityContextHolder静态方法的情况下在Spring控制器中获取当前SecurityContext?

如何在不使用SecurityContextHolder静态方法的情况下在Spring控制器中获取当前SecurityContext?,spring,spring-security,Spring,Spring Security,在我的应用程序中,当用户更新其用户名时,我希望从安全上下文中清除该身份验证,因为在基本身份验证调用中使用了旧用户名 在我的控制器中进行更新,这对于 SecurityContextHolder.getContext().setAuthentication(null); 但是我正在寻找一种不使用静态方法访问当前安全上下文的方法,以便于单元测试(更不用说静态调用似乎不是很“灵活”) 这看起来和我想要的非常接近,但我希望有一种不用编写包装类就能做到这一点的方法。我还尝试将SecurityContext

在我的应用程序中,当用户更新其用户名时,我希望从安全上下文中清除该身份验证,因为在基本身份验证调用中使用了旧用户名

在我的控制器中进行更新,这对于

SecurityContextHolder.getContext().setAuthentication(null);
但是我正在寻找一种不使用静态方法访问当前安全上下文的方法,以便于单元测试(更不用说静态调用似乎不是很“灵活”)

这看起来和我想要的非常接近,但我希望有一种不用编写包装类就能做到这一点的方法。我还尝试将SecurityContextHolderStrategy注入到我的控制器构造函数中(正如在该答案和相关答案中暗示的那样),但没有定义这种类型的bean

那么:有没有一种方法可以在不使用SecurityContextHolder静态方法的情况下访问Spring控制器中当前的SecurityContext


我的spring security版本是3.2.5版本。

不是afaik。还有为什么会不好呢?在你的测试中,你也可以测试这个(甚至有一个很好的模拟),你明确地为Spring Security写这篇文章,所以试图隐藏这一事实是不好的。我同意我们应该清楚我们在做什么,但我不确定你关于如何测试这个的意思。你说的这个很好的模拟是什么?如果你有一个静态调用,你会如何使用它?您是在谈论PowerMock吗?关于测试,请正确设置您的前置条件。只需在运行测试之前设置上下文(在
@before
注释方法中)。您可以使用一个
TestingAuthenticationToken
进行此操作,您可以在
SecurityContextImpl
中对自己进行设置,您可以使用
setContext
方法对其进行设置。这样,您就可以很好地设置前提条件,确保在
@After
注释方法中调用
SecurityContextHolder.clearContext()
。当然,这可能会有帮助:您的意思是使用参数解析器静态获取SecurityContext,但在控制器方法级别注入它?有趣的方法。。。