@WithMockUser с пользовательской реализацией - PullRequest
0 голосов
/ 17 октября 2018

Я использую токены OAuth2 и JWT для защиты приложения.Я расширяю org.springframework.security.core.userdetails , чтобы добавить некоторые дополнительные атрибуты к токену, которые затем можно использовать для выполнения авторизации, если конечная точка называется.

public class CustomUser extends User {
     private Set<String> bookIds;

     public CustomUser(String username, String password, Collection<? extends GrantedAuthority> authorities) {
         super(username, password, authorities);
     }

     public CustomUser(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
         super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
     }
}

У меня также есть пользовательская реализация org.springframework.security.access.PermissionEvaluator, которая способна десериализовать токен и проверить, что пользовательские атрибуты являются его частью, которая может быть добавлена ​​в конечные точки контроллера как таковые.

@PreAuthorize("hasPermission(authentication, #bookId,'read')")

Теперь все работает нормально, я могу протестировать свое приложение через почтальона, и только пользователи с действительным токеном JWT, у которого bookID в части URL своего набора bookIds могут получить доступ к ресурсу как таковой

@PreAuthorize("hasPermission(authentication, #bookId,'read')")
@GetMapping(value = "api/books/{bookId}")
public Book getBook(@PathVariable String bookId) {}

ОДНАКО, я изо всех сил пытаюсь проверить это, так как это часть микросервисного приложения, где аутентификация и сервисы не являются частью одного и того же проекта и будут работать на разных виртуальных машинах.ИДЕАЛЬНО, я хотел бы иметь возможность макетировать токен в каждой из служб и добавлять любые значения, которые мне нужны, внутри этого набора bookId.Я знаю, что после весны 4 мы можем использовать @WithMockUser, однако, насколько я могу судить, это ограничено именем пользователя / паролем / ролью / полномочиями, например:

@WithMockUser(username = "ram", roles={"ADMIN"})

Что бы я действительно хотел сделатьэто либо расширить эту аннотацию для поддержки моего пользовательского атрибута 'bookId', либо способ добавить в него макет.Возможно ли это, и если нет, каковы мои альтернативы, так как я не смог бы вызвать моего провайдера аутентификации в моих модульных тестах, поскольку реализация находилась бы в другом весеннем контексте, размещенном в отдельном приложении.

Большое спасибо заранее!

1 Ответ

0 голосов
/ 18 июля 2019

Вы можете использовать аннотацию @WithUserDetails.
Если у вас есть пользователь с именем пользователя "user1", вы можете аннотировать свой тест с помощью @WithUserDetails("user1"), и он будет выполняться с принципалом CustomUser, включаяПользовательский атрибут "bookId", связанный с "user1".
Дополнительную информацию об аннотации можно найти в документах Spring-Security .

. Если вы хотите больше гибкости, вы можете такжеиспользуйте аннотацию @WithSecurityContext.
Это позволяет вам создать собственную аннотацию, например, @WithMockCustomUser, где вы сами устанавливаете контекст безопасности.
Более подробную информацию вы можете найти в документах Spring-Security .

Еще один вариант, если вы используете MockMvc для запуска своих тестов, это использовать постпроцессор запроса .
Ваш тест будет выглядеть так

mvc
    .perform(get("/api/books/1")
    .with(user(customUser)));

где customUser - это экземпляр CustomUser, который вы создали в тесте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...