gpt4 book ai didi

spring-mvc - 如何 JUnit 测试 @PreAuthorize 注释及其由 spring MVC Controller 指定的 spring EL?

转载 作者:行者123 更新时间:2023-12-04 03:23:25 25 4
gpt4 key购买 nike

我在 Spring MVC Controller 中定义了这个方法:

@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 测试中,我想调用这个方法并确保 PreAuthorize 条件得到验证。但是,当我在 JUnit 测试中使用错误帐户设置用户主体时,没有错误并且该方法完成。似乎绕过了注释。
但是当我以正常方式(不是测试)调用此方法时,会验证 PreAuthorize。

如果可能,如何在 junit 测试中测试此注释,以及如何在抛出异常时捕获异常?

谢谢,
尼古拉斯

最佳答案

由于要测试通过 Spring AOP 实现的功能,需要使用 Spring TestContext针对应用程序上下文运行测试的框架。

然后您创建一个具有最少安全配置的基本测试:
abstract-security-test.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 = "..." />
AbstractSecurityTest.java :
@ContextConfiguration("abstract-security-test.xml")
abstract public class AbstractSecurityTest {
@Autowired
private AuthenticationManager am;

@After
public void clear() {
SecurityContextHolder.clearContext();
}

protected void login(String name, String password) {
Authentication auth = new UsernamePasswordAuthenticationToken(name, password);
SecurityContextHolder.getContext().setAuthentication(am.authenticate(auth));
}
}

现在您可以在测试中使用它:
@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-mvc - 如何 JUnit 测试 @PreAuthorize 注释及其由 spring MVC Controller 指定的 spring EL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5403818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com