Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Security, JUnit: @WithUserDetails for user created in @Before

Tags:

In JUnit tests with Spring MockMVC, there are two methods for authenticating as a Spring Security user: @WithMockUser creates a dummy user with the provided credentials, @WithUserDetails takes a user's name and resolves it to the correct custom UserDetails implementation with a custom UserDetailsService (the UserDetailsServiceImpl).

In my case, the UserDetailsService loads an user from the database. The user I want to use was inserted in the @Before method of the test suite.

However, my UserDetailsServiceImpl does not find the user.

In my @Before, I insert the user like this:

User u = new User();
u.setEMail("[email protected]");
u = userRepository.save(u);

And in the 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;
}

How can I use an account created in @Before with @WithUserDetails?

like image 747
fNek Avatar asked Feb 26 '17 09:02

fNek


People also ask

What is default user for Spring Security?

As of Spring Security version 5.7. 1, the default username is user and the password is randomly generated and displayed in the console (e.g. 8e557245-73e2-4286-969a-ff57fe326336 ).

Does Spring Security use default login form?

Spring security secures all HTTP endpoints by default. A user has to login in a default HTTP form. To enable Spring Boot security, we add spring-boot-starter-security to the dependencies.


2 Answers

Unfortunately, you can't do easily @WithUserDetails with @Before, because Spring @WithUserDetails annotation will invoke Spring security context test listener before running setUp method with @Before.

Here is https://stackoverflow.com/a/38282258/1814524 a little trick and answer to your question.

like image 162
hya Avatar answered Sep 18 '22 12:09

hya


You can use @PostConstruct instead of @Before. That did the trick for me. Can anybody confirm that?

like image 44
gofabian Avatar answered Sep 18 '22 12:09

gofabian