вызов остальных API с requestbody и аутентификацией принципала - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть API отдыха, у которого есть доступ на основе ролей к его методу HTTP POST.Он использует Spring-Security для доступа к API только для авторизованных пользователей.

У меня есть 2 вопроса,

  1. как внешний клиент может передать тело запроса и объект пользователя (@AuthenticationPrincipal)чтобы сделать этот вызов API

  2. Как я могу написать junit для проверки ниже кусок кода,

    <code>@PreAuthorize("hasAuthority('ADMIN')") @PostMapping("/api/access/submit") public ResponseEntity<OrderAdminResponse> create(@RequestBody OrderAdminRequest orderAdminSubmitRequest,@AuthenticationPrincipal UserObject user) { return ResponseEntity.accepted().body(orderService.submit(orderAdminSubmitRequest)); }

Мой объект пользователя ниже,



    public class UserObject {
    private final String name;
    private final String id;
    private final String email;

    private UserObject(String name, int id, String email){
    this.name = name; this.id = id; this.email = email
    }

    public Collection<String> getRoles() {
    return 
    (Collection)this.getAuthorities().stream()
    .map(GrantedAuthority::getAuthority).collect(Collectors.toList());
     }

    public boolean isUserInRole(String role) {
    return this.getAuthorities().stream().anyMatch((a) -> {
        return a.getAuthority().equals(role);
    })
    }
   }
 </code>

1 Ответ

1 голос
/ 27 сентября 2019

Контроллер будет автоматически заполнять принципала аутентификации, когда вы делаете запрос с аутентифицированным пользователем.
Например, если вы используете базовую аутентификацию HTTP для защиты вашей конечной точки, тогда субъект будет заполняться из Authorization заголовок.Тело вашего запроса остается неизменным независимо от того, извлекаете ли вы принципал или нет.

Простой способ протестировать ваш контроллер - использовать поддержку, предоставляемую Spring Security.
Если вы используете MockMvc, один из вариантов - использовать постпроцессор для вызова вашей конечной точки с различными типамипользователи.

this.mvc.perform(post("/api/access/submit")
    .content("...")
    .with(user("user").roles("USER")))
    .andExpect(status().isUnauthorized());
this.mvc.perform(post("/api/access/submit")
    .content("...")
    .with(user("admin").roles("ADMIN")))
    .andExpect(status().isOk());

Подробнее о поддержке тестирования Spring Security можно узнать из документации здесь .

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