You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Micronaut集成security-jwt后所有路由被禁止,如何配置无需JWT校验的匿名路由

问题原因

你加了注解仍然返回401的核心原因是Micronaut Security默认关闭了匿名用户识别,SecurityRule.IS_ANONYMOUS规则不会生效,且没有添加安全注解的路由默认会被全局拦截。

解决方案

方案一:全局配置放行路径(推荐)

直接在项目的application.yml配置文件中添加如下规则,匹配需要放行的路径即可:

micronaut:
  security:
    enabled: true
    # 开启匿名用户识别
    anonymous:
      enabled: true
    # 配置放行路径规则
    intercept-url-map:
      - pattern: /log/** # 匹配/log路径下所有接口
        access:
          - isAnonymous()

如果用application.properties配置,对应写法如下:

micronaut.security.enabled=true
micronaut.security.anonymous.enabled=true
micronaut.security.intercept-url-map[0].pattern=/log/**
micronaut.security.intercept-url-map[0].access[0]=isAnonymous()

方案二:用@Secured注解逐个控制

如果需要更细粒度的接口权限控制,用注解的话需要先做基础配置,再给对应接口加注解:

  1. 先在配置文件中开启匿名用户识别,配置如下:
micronaut:
  security:
    enabled: true
    anonymous:
      enabled: true
  1. 给所有需要放行的接口添加@Secured(SecurityRule.IS_ANONYMOUS)注解,你代码中的/log/log接口没有加注解所以会被拦截,补充后代码示例:
package logfetcher;

import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
import io.micronaut.security.annotation.Secured;
import io.micronaut.security.rules.SecurityRule;

@Controller("/log")
public class LogFethcerContoller {
    @Get
    @Secured(SecurityRule.IS_ANONYMOUS)
    @Produces(MediaType.TEXT_PLAIN)
    public String index() {
        return "Hello World";
    }

    @Get("log")
    @Secured(SecurityRule.IS_ANONYMOUS) // 补充匿名访问注解
    public String index1() {
        return "Hello World";
    }
}

额外排查点

如果做完上述配置仍然返回401,检查两点:

  • 确认你导入的@Secured注解是io.micronaut.security.annotation.Secured,不要误导入其他框架的同名注解
  • 排查项目中是否有自定义的全局安全过滤器,优先级高于内置规则导致所有请求被拦截

内容的提问来源于stack exchange,提问作者Tomislav Muic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:08