Spring mvc JUnit如何测试@PreAuthorize注释及其由SpringMVC控制器指定的SpringEL?

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

我在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 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(...);
    }
}