Я использую токены 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', либо способ добавить в него макет.Возможно ли это, и если нет, каковы мои альтернативы, так как я не смог бы вызвать моего провайдера аутентификации в моих модульных тестах, поскольку реализация находилась бы в другом весеннем контексте, размещенном в отдельном приложении.
Большое спасибо заранее!