在测试上进行身份验证时转换对象

时间:2013-08-21 10:08:42

标签: spring testing spring-security spring-security-ldap

我的Spring应用程序中有以下方法

public static String getCurrentUserStudentId() {
    return ((LdapPerson) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getID();
}

这适用于应用程序运行,但是当我运行一个调用此方法的测试时,它会给出

org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken cannot be cast to fi.utu.security.ldap.userdetails.LdapPerson

我对Spring Security并不熟悉所有可能相关的文件,但问我。我希望有人能说出如何做到这一点。

1 个答案:

答案 0 :(得分:0)

SecurityContextHolder在静态变量中保留对“策略”的引用,这意味着此细节从测试泄漏到测试。

您有几种选择:

  1. 在测试中,使用其中一个SecurityContextHolder

  2. 设置正确的策略
  3. getCurrentUserStudentId创建一个模拟实现,它返回测试的固定结果。

  4. 将代码放入bean中,然后注入而不是调用SecurityContextHolder。实现这个bean的两个版本:一个调用SecurityContextHolder,另一个调用返回一个字符串。