Spring Security,JUnit:@WithUserDetails用于在@Before中创建的用户

fNe*_*Nek 15 java junit spring spring-security mockmvc

在使用Spring MockMVC的JUnit测试中,有两种方法可以作为Spring Security用户进行身份验证:@WithMockUser使用提供的凭据创建虚拟用户,@WithUserDetails获取用户的名称并UserDetails使用自定义UserDetailsService(the UserDetailsServiceImpl)将其解析为正确的自定义实现.

在我的例子中,UserDetailsService从数据库加载用户.我想要使​​用的用户插入@Before了测试套件的方法中.

但是,我UserDetailsServiceImpl找不到用户.

在我@Before,我插入这样的用户:

User u = new User();
u.setEMail("test@test.de");
u = userRepository.save(u);
Run Code Online (Sandbox Code Playgroud)

并在UserDetailsServiceImpl:

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = this.userRepository.findOneByEMail(username);

    if (user == null)
        throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username));
    return user;
}
Run Code Online (Sandbox Code Playgroud)

如何使用创建的帐户@Before@WithUserDetails

New*_*bie 8

使用setupBefore = TEST_EXECUTION

这将有效地导致@WithUserDetails执行 after@Before@BeforeEach

@BeforeEach
public void createUser() {
   ...
}

@Test
@WithUserDetails(value = "username", setupBefore = TestExecutionEvent.TEST_EXECUTION)
public void expectToWork() {
   ...
}
Run Code Online (Sandbox Code Playgroud)


hya*_*hya 7

不幸的是,你不能轻易@WithUserDetails搞定@Before,因为Spring @WithUserDetails注释会在运行setUp方法之前调用Spring安全上下文测试监听器@Before.

这是/sf/answers/2679758091/一个小技巧并回答你的问题.


gof*_*ian 7

您可以使用@PostConstruct代替@Before. 这对我有用。有人可以证实吗?


Mic*_*ksa 6

@Inject
private EntityManager em;

@Inject
PlatformTransactionManager txManager;

@BeforeTransaction
public void setup() {
    new TransactionTemplate(txManager).execute(status -> {

        User u = new User();
        u.setEMail("test@test.de");
        em.save(u);

        return null;
    });
}

@AfterTransaction
public void cleanup() {
    new TransactionTemplate(txManager).execute(status -> {
        // Check if the entity is managed by EntityManager.
        // If not, make it managed with merge() and remove it.
        em.remove(em.contains(u) ? user1 : em.merge(u));
        return null;
    });
}


@Test
@Transactional
@WithUserDetails(value = "test@test.de", userDetailsServiceBeanName = "loadUserByUsername")
public void test() {

}
Run Code Online (Sandbox Code Playgroud)