当前位置: 首页 > 知识库问答 >
问题:

Micronaut security无法“安全”

颜鸿云
2023-03-14

我有一个简单的基于Micronaut的“Hello World”服务,它内置了一个简单的安全性(为了测试和演示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()lambda返回false。在教程中,它返回true。我假设,如果返回false,安全检查将失败,并且失败将导致hello服务无法响应。

根据教程,要开始使用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);
   }
}

问题发生在我运行微服务并访问Helo world URL时。(http://localhost:8080/hello)我无法导致对服务的访问失败。筛选器捕获所有请求,并且安全对象已启用,但似乎并不阻止对hello服务的访问。我不知道需要什么才能使访问失败。

有人能在这件事上帮忙吗?谢谢.

共有1个答案

邹昊
2023-03-14

当您没有访问资源或处理请求的权限时,您需要在筛选器中更改请求。您的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的security模块,您可以使用@Securited注释或在配置文件中写入访问规则更多文档中的示例

 类似资料:
  • 问题内容: 我在虚拟环境中安装boto3时遇到问题。 我已经按文件所说完成了。首先,我激活了虚拟环境。然后我做了一个: 现在我输入python 但是如果我导入boto,它会起作用 为什么在安装boto3时安装boto 2.38。我尝试关闭终端,然后重新打开。我应该重启Ubuntu计算机吗? 问题答案: 不要在虚拟环境中使用,因为它会忽略环境变量,因此引用您的 全局 pip安装。 因此,在激活环境的

  • 我是android开发新手。我成功生成了签名apk。它成功安装在android更高版本中。但是当我尝试在android kitkat版本中安装时,一旦我们单击“安装”按钮,它就会失败而没有任何错误消息。通过命令提示符尝试使用adb时,应用程序成功安装,安装调试也正常。“Kitkat中的直接apk安装失败”请帮助

  • 任何帮助都将得到高度赞赏。 谢谢,沙兹

  • 我正试图在本地环境中安装weblogic。但是当试图安装weblogic应用程序时,它说java.exe或javaw.exe已经停止工作,程序崩溃。关于如何解决上述问题有什么想法吗? 下面是Weblogic文件夹中的java路径 谢谢

  • 下面是我的存储库:https://github.com/merajsiddiqui/ibm-watson 如果您能指导我成功发布,那么任何人都可以下载这个库,我将不胜感激。

  • 问题内容: 我无法在Windows7 x64系统中安装mysql2 gem。我尝试使用32位和64位版本的MySQL服务器,但没有一个让我更进一步。 我安装了Ruby 1.8,开发工具包和Rails平台。我什至安装了minGW来允许事物的C ++ / C编译。MySQL Server已安装在默认位置。 运行命令时: 我从控制台收到以下输出: 根据Rubygems,我的环境的输出为: 系统上还安装了