Spring 模拟身份验证
如何在下面的代码中模拟身份验证 您需要从SecurityContextHolder开始,还是可以以某种方式注入假身份 编辑: 我同意拉尔夫的第一个解决方案。不过,哔叽布解决方案似乎普遍适用。下面是经过测试的代码:Spring 模拟身份验证,spring,mockito,Spring,Mockito,如何在下面的代码中模拟身份验证 您需要从SecurityContextHolder开始,还是可以以某种方式注入假身份 编辑: 我同意拉尔夫的第一个解决方案。不过,哔叽布解决方案似乎普遍适用。下面是经过测试的代码: final Authentication auth = mock(Authentication.class); when(auth.isAuthenticated()).thenReturn(true); SecurityContextHolder.setContext(new Se
final Authentication auth = mock(Authentication.class);
when(auth.isAuthenticated()).thenReturn(true);
SecurityContextHolder.setContext(new SecurityContext() {
@Override
public Authentication getAuthentication() {
return auth;
}
@Override
public void setAuthentication(Authentication auth) {
}
});
编辑:见下文
您需要调用静态方法,而不能直接使用Mockito进行模拟。您可以将PowerMock与Mockito结合使用
如果它在测试中真的是一个例外,您可以通过创建本地类SecurityContextHolder来作弊。不要忘记删除相应的导入…:
class SecurityContextHolder {
static Authentication auth;
static SecurityContext getContext() {
return new SecurityContext {
public Authentication getAuthentication() {
return auth;
}
public void setAuthentication(Authentication auth) {
this.auth = auth;
}
}();
}
}
}
并在其中放入mockAuthentication.class
编辑:
不需要特别的课程,谢谢拉尔夫的主意。只要打电话:
final Authentication auth = mock(Authentication.class);
SecurityContextHolder.setContext(new SecurityContext {
return new SecurityContext {
public Authentication getAuthentication() {
return auth;
}
public void setAuthentication(Authentication auth) {
this.auth = auth;
}
});
注意:我目前没有可用的开发系统,甚至无法测试语法,但原理应该可以工作。编辑:见下文
您需要调用静态方法,而不能直接使用Mockito进行模拟。您可以将PowerMock与Mockito结合使用
如果它在测试中真的是一个例外,您可以通过创建本地类SecurityContextHolder来作弊。不要忘记删除相应的导入…:
class SecurityContextHolder {
static Authentication auth;
static SecurityContext getContext() {
return new SecurityContext {
public Authentication getAuthentication() {
return auth;
}
public void setAuthentication(Authentication auth) {
this.auth = auth;
}
}();
}
}
}
并在其中放入mockAuthentication.class
编辑:
不需要特别的课程,谢谢拉尔夫的主意。只要打电话:
final Authentication auth = mock(Authentication.class);
SecurityContextHolder.setContext(new SecurityContext {
return new SecurityContext {
public Authentication getAuthentication() {
return auth;
}
public void setAuthentication(Authentication auth) {
this.auth = auth;
}
});
注意:我目前没有可用的开发系统,甚至无法测试语法,但princip应该可以工作。问题是很难模拟静态方法调用,但您有不同的方法来处理这个特定的安全上下文问题 第一种方法:在测试中设置AuthenticationToken
@Test
public void testSomething() {
try{
SecurityContextHolder.getContext()
.setAuthentication(new TestingAuthenticationToken(login, null));
//invoke test object
finally {
SecurityContextHolder.clearContext();
}
}
第二种方法:在SecurityContextHolder中注入模拟
如果希望通过模拟SecurityContext对示例进行更多控制,则可以执行以下操作:
SecurityContextHolder.setStrategyName("com.test.MyStrategy")
然后,您需要一个实现SecurityContextHolderStrategy的类MyStrategy,并返回模拟的SecurityContext for SecurityContext getContext
第三种方法:在SecurityContext.setContext中注入模拟。问题是很难模拟静态方法调用,但您有不同的方法来处理这个特定的安全上下文问题 第一种方法:在测试中设置AuthenticationToken
@Test
public void testSomething() {
try{
SecurityContextHolder.getContext()
.setAuthentication(new TestingAuthenticationToken(login, null));
//invoke test object
finally {
SecurityContextHolder.clearContext();
}
}
第二种方法:在SecurityContextHolder中注入模拟
如果希望通过模拟SecurityContext对示例进行更多控制,则可以执行以下操作:
SecurityContextHolder.setStrategyName("com.test.MyStrategy")
然后,您需要一个实现SecurityContextHolderStrategy的类MyStrategy,并返回模拟的SecurityContext for SecurityContext getContext
第三种方法:在处理它的SecurityContext.setContext中插入一个mock。谢谢这就解决了。谢谢在问题中添加了代码的测试版本。泰铢:在问题中添加了代码的测试版本。泰铢: