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注解逐个控制
如果需要更细粒度的接口权限控制,用注解的话需要先做基础配置,再给对应接口加注解:
- 先在配置文件中开启匿名用户识别,配置如下:
micronaut: security: enabled: true anonymous: enabled: true
- 给所有需要放行的接口添加
@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
相关产品推荐
相关产品推荐

