spring-cloud http认证 问题小记

项目环境

项目采用spring-cloud方案。利用eureka做服务注册发现,通过zuul反向代理到具体的服务,处理用户请求。

描述

根据需求,需在spring-boot服务指定路径上加一个http认证。
pom.xml中配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>    </dependency>

配置所有/ms路径及以下的接口都需要认证
application.yml中:

security:
    basic:
        enabled: true
        path: /ms/**
    user:
        name: root
        password: root

配完之后,本地测试遇到了一个问题1

/ms路径及以下确实按预计有了认证弹窗,但是/logfile下也有了弹窗,而我并没有配置

问题1 解决

/logfile是spring提供的endpoints,还有/info,/health等,我访问了下,均没有弹出认证框,于是查官方文档,发现了这么一句话:

Depending on how an endpoint is exposed, the sensitive property may be used as a security hint.

看来是spring官方认为/logfile是敏感信息,所以当开启http basic认证时才弹出认证框。继续查阅文档,找到将其开放的方法

endpoint.logfile.sensitive=false

/logfile是解决了,但是如果还有其他的endpoints默认设为敏感呢,那我岂不是要一个个找出来再配置过去?太麻烦了,于是继续翻文档,找到 Monitoring and management over HTTP中的描述

If you are deploying applications behind a firewall, you may prefer that all your actuator endpoints can be accessed without requiring authentication. You can do this by changing the management.security.enabled property.

于是在配置文件中配置:

management.security.enabled=false

本地测试后达到预期,这下不用一个个配过去了,耶!
我把项目部署到了内测环境,遇到了问题2

内测环境访问/ms,确实弹出了认证框,但是怎么样输入认证信息,就是通不过

问题2 解决

于是回顾了下http bacis的原理,分析情况,显然在访问/ms时,服务端已经向浏览器响应了status=401的response,接下来在输入认证信息时,由浏览器向服务发送带有包含“Authorization”的请头。
查询log,果然服务端收到的request header中并未包含“Authorization”信息。

分析原因,内测和本地的环境区别,就在于内测用了zuul反向代理。推测在请求经过zuul时,“Authorization”信息丢失了。

于是,我在本地模拟了下内测环境,测试发现:在zuul收到请求时,request中正确接收到了“Authorization”信息,但是在向服务层转发时,确实丢失了。ok,问题证实。

于是查询官方文档zuul,得到下面的描述

It’s OK to share headers between services in the same system, but you probably don’t want sensitive headers leaking downstream into external servers. You can specify a list of ignored headers as part of the route configuration.

确定了,spring zuul转发请求时默认去掉了header中的Cookie,Set-Cookie,Authorization信息,于是做如下配置(applicationName为该服务名):

zuul.routes.applicationName.sensitiveHeaders=Cookie,Set-Cookie

配置之后,zuul将不再过滤“Authorization”信息。部署内测后测试通过,耶!

后来查了下,也可以在zuulFilter中配置preFilter,然后通过requestContext.addZuulRequestHeader解决,地址here

这些问题搞了挺久的,解决后果然心情舒畅。得出一个结论:

多看官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值