项目环境
项目采用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。
这些问题搞了挺久的,解决后果然心情舒畅。得出一个结论:
多看官方文档