Есть несколько способов имитировать безопасность, используя @WithMockUser
, @WithAnonymousUser
, @WithUserDetails
, @WithSecurityContext
. Вы можете использовать эти аннотации с @Test
методом
@WithMockUser
- Пользователь с именем пользователя "user" "не обязательно должно существовать, так как мы издеваемся над пользователем
- Аутентификация, заполненная в
SecurityContext
, имеет тип UsernamePasswordAuthenticationToken
- Принципал аутентификации - это объект User Spring Security.
- Пользователь будет иметь имя пользователя «пользователь» , пароль «пароль» и один GrantedAuthority с именем «ROLE_USER» is используется.
- Вы можете настроить такие параметры, как имя пользователя, роли, значение
@WithAnonymousUser
Использование @WithAnonymousUser
позволяет работать как анонимный пользователь. Это особенно удобно, когда вы используете sh для запуска большинства тестов с определенным пользователем c, но хотите запустить несколько тестов от имени анонимного пользователя. Например, следующее будет работать сMockUser1 и withMockUser2 с использованием @WithMockUser
и анонимно в качестве анонимного пользователя .
@WithUserDetails
Хотя @WithMockUser
- очень удобный способ начать работу, он может не работать во всех случаях. Например, приложения обычно ожидают, что принципал Authentication
будет иметь специфический c тип . Это сделано для того, чтобы приложение могло ссылаться на принципала как на настраиваемый тип и уменьшать связь в Spring Security.
Пользовательский принципал часто возвращается настраиваемым UserDetailsService
, который возвращает объект, реализующий оба UserDetails
и произвольного типа. В подобных ситуациях полезно создать тестового пользователя с помощью настраиваемой службы UserDetailsService. Это именно то, что делает @WithUserDetails
.
@WithSecurityContext
Мы можем создать нашу собственную аннотацию, использующую @WithSecurityContext для создания любого SecurityContext, который мы хотим. Например, мы могли бы создать аннотацию с именем @WithMockCustomUser как @WithSecurityContext(factory = WithMockCustomUserSecurityContextFactory.class)