Spring mvc JUnit如何测试@PreAuthorize注释及其由SpringMVC控制器指定的SpringEL?
我在Spring MVC控制器中定义了此方法:Spring mvc JUnit如何测试@PreAuthorize注释及其由SpringMVC控制器指定的SpringEL?,spring-mvc,junit,controller,spring-security,spring-el,Spring Mvc,Junit,Controller,Spring Security,Spring El,我在Spring MVC控制器中定义了此方法: @RequestMapping(value = "{id}/content", method=RequestMethod.POST) @PreAuthorize("principal.user.userAccount instanceof T(com.anonym.model.identity.PedagoAccount) AND principal.user.userAccount.userId == #object.pedago.userId
@RequestMapping(value = "{id}/content", method=RequestMethod.POST)
@PreAuthorize("principal.user.userAccount instanceof T(com.anonym.model.identity.PedagoAccount) AND principal.user.userAccount.userId == #object.pedago.userId AND #form.id == #object.id")
public String modifyContent(@PathVariable("id") Project object, @Valid @ModelAttribute("form") ProjectContentForm form) {
....
}
然后在我的JUnit测试中,我想调用这个方法并确保预授权条件得到验证。但是,当我在JUnit测试中使用坏帐户设置用户主体时,没有错误,方法完成。似乎忽略了注释。但是,当我以正常方式调用此方法(不是测试)时,预授权是经过验证的 如果可能的话,如何在junit测试中测试此注释,以及如何在抛出异常时捕获异常 谢谢,
Nicolas因为您想测试通过SpringAOP实现的特性,所以需要使用框架对应用程序上下文运行测试 然后创建一个具有最低安全配置的基本测试:
抽象安全测试.xml
:
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref = "userService" />
</security:authentication-manager>
<security:global-method-security pre-post-annotations="enabled" />
<bean id = "userService" class = "..." />
现在,您可以在测试中使用它:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
public class CreatePostControllerSecurityTest extends AbstractSecurityTest {
...
@Test
@ExpectedException(AuthenticationCredentialsNotFoundException.class)
public void testNoAuth() {
controller.modifyContent(...);
}
@Test
@ExpectedException(AccessDeniedException.class)
public void testAccessDenied() {
login("userWithoutAccessRight", "...");
controller.modifyContent(...);
}
@Test
public void testAuthOK() {
login("userWithAccessRight", "...");
controller.modifyContent(...);
}
}
谢谢,它可以很好地用于身份验证,但是如果要测试在预授权注释中定义的整个Spring EL,我该怎么做?
谢谢,它可以很好地用于身份验证,但是如果我要测试在预授权注释中定义的整个Spring EL,我该怎么做?我的意思是如何验证principal.user.userAccount.userId==#object.pedago.userId和#form.id==#object.id,其中#object和#form指定modifyContent方法的变量。对于未经验证的安全Spring EL,是否有任何异常需要捕获?@ExpectedException注释已被弃用;使用JUnit4的@Test(预期=…)代替。非常好的建议。这对我很有效。我做了一件有点不同的事情,我将现有的
security context.xml
从webapp context.xml
中分离出来,这样我就可以在测试中使用安全上下文配置,而不必包含web app内容。这样,我可以在测试中重用现有的安全配置。请注意,在预授权中使用“principal”的其他人,这将失败,并出现NullPointerException,并且不会触发重新授权,除非在预授权批注或security.xml中包含具有isAuthenticated()效果的内容
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
public class CreatePostControllerSecurityTest extends AbstractSecurityTest {
...
@Test
@ExpectedException(AuthenticationCredentialsNotFoundException.class)
public void testNoAuth() {
controller.modifyContent(...);
}
@Test
@ExpectedException(AccessDeniedException.class)
public void testAccessDenied() {
login("userWithoutAccessRight", "...");
controller.modifyContent(...);
}
@Test
public void testAuthOK() {
login("userWithAccessRight", "...");
controller.modifyContent(...);
}
}