问题描述:项目上重写权限管理模块,整合Shiro做权限管理,调试过程发现登陆过后,调用需要授权接口出现异常:org.apache.shiro.authz.UnauthenticatedException,表示当前Subject未认证。查看请求发现Response的Header列表中没有Set-Cookie,即shiro定义的Cookie没有写入浏览器。而本地使用PostMan调试未报上述错误。
原因:项目中使用zuul作为网关,zuul的RibbonRoutingFilter接收到Response后进行了重新构建,本地调试因为直接调用微服务节点不经过网关,所以没有报错。
@Override public Object run() { RequestContext context = RequestContext.getCurrentContext(); this.helper.addIgnoredHeaders(); try { RibbonCommandContext commandContext = buildCommandContext(context); ClientHttpResponse response = forward(commandContext); setResponse(response); return response; } catch (ZuulException ex) { throw new ZuulRuntimeException(ex); } catch (Exception ex) { throw new ZuulRuntimeException(ex); } }
根据ZuulProperties去除敏感头部信息,默认为:
private Set<String> sensitiveHeaders = new LinkedHashSet<>(
Arrays.asList("Cookie", "Set-Cookie", "Authorization"));
修复方案:设置
zuul: sensitive-headers: "*"//或者置空