Микронавт безопасности не может "обеспечить" - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть простой сервис «hello world» на основе Micronaut, в который встроена простая защита (для тестирования и иллюстрации безопасности Micronaut). Код контроллера в сервисе, который реализует сервис hello, представлен ниже:

@Controller("/hello")
public class HelloController
{
   public HelloController()
   {
      // Might put some stuff in in the future
   }

    @Get("/")
    @Produces(MediaType.TEXT_PLAIN)
    public String index()
    {
       return("Hello to the World of Micronaut!!!");
    }
}

Чтобы протестировать механизм безопасности, я следовал инструкциям руководства Micronaut и создал класс службы безопасности:

@Singleton
public class SecurityService
{
    public SecurityService()
    {
       // Might put in some stuff in the future
    }

    Flowable<Boolean> checkAuthorization(HttpRequest<?> theReq)
    {
        Flowable<Boolean> flow = Flowable.fromCallable(()->{
           System.out.println("Security Engaged!");
           return(false);    <== The tutorial says return true
        }).subscribeOn(Schedulers.io());

        return(flow);
    }

}

Следует отметить, что при отклонении от учебника лямбда flowable.fromCallable () возвращает false. В учебнике он возвращает истину. Я предполагал, что проверка безопасности потерпит неудачу, если будет возвращено ложное значение, и что из-за сбоя служба приветствия не сможет ответить.

Согласно учебным пособиям, чтобы начать использовать объект Security, необходимо иметь фильтр. Фильтр, который я создал, показан ниже:

@Filter("/**")
public class HelloFilter implements HttpServerFilter
{
   private final SecurityService secService;

   public HelloFilter(SecurityService aSec)
   {
      System.out.println("Filter Created!");
      secService = aSec;
   }

   @Override
   public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> theReq, ServerFilterChain theChain)
   {
      System.out.println("Filtering!");
      Publisher<MutableHttpResponse<?>> resp = secService.checkAuthorization(theReq)
                                                         .doOnNext(res->{
                                                            System.out.println("Responding!");
                                                         });

      return(resp);
   }
}

Проблема возникает, когда я запускаю микросервис и получаю доступ к URL-адресу Helo world. (http://localhost:8080/hello) Я не могу вызвать сбой доступа к службе. Фильтр перехватывает все запросы, и объект безопасности задействован, но, похоже, не препятствует доступу к службе приветствия. Я не знаю, что это требуется для сбоя доступа.

Может ли кто-нибудь помочь в этом вопросе? Спасибо.

1 Ответ

0 голосов
/ 04 сентября 2018

Вам нужно изменить запрос в вашем фильтре, когда у вас нет доступа к ресурсу или обработать запрос как обычно. Ваш HelloFilter выглядит так:

@Override
public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> theReq, ServerFilterChain theChain) {
    System.out.println("Filtering!");
    Publisher<MutableHttpResponse<?>> resp = secService.checkAuthorization(theReq)
            .switchMap((authResult) -> { // authResult - is you result from SecurityService
                if (!authResult) {
                    return Publishers.just(HttpResponse.status(HttpStatus.FORBIDDEN)); // reject request
                } else {
                    return theChain.proceed(theReq); // process request as usual
                }
            })
            .doOnNext(res -> {
                System.out.println("Responding!");
            });

    return (resp);
}

И последнее - у micronaut есть модуль безопасности с SecurityFilter, вы можете использовать аннотации @Secured или записывать правила доступа в конфигурационные файлы больше примеров в документе

...