在过去的几天里,我一直在苦苦寻找如何做到这一点,最后决定承认失败并寻求帮助,拜托!
我遵循 Dave Syer 博士关于 Angular 和 Spring Security 的教程,特别是 Zuul 代理作为 api 网关以及将 Spring Session 与 Redis 一起使用(https://github.com/spring-guides/tut-spring-security-and-angular-js/tree/master/double#_sso_with_oauth2_angular_js_and_spring_security_part_v)
我遇到的问题是,我通过网关从具有以下标头的外部应用程序调用资源休息服务:
String plainCreds = "user:password";
byte[] plainCredsBytes = plainCreds.getBytes();
byte[] base64CredsBytes = Base64.getEncoder().encode(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds);
进行身份验证,然后由 zuul 路由,然后资源通过 redis 访问经过身份验证的会话。
问题是会话似乎只在请求响应后才提交到网关中的 redis。所以发生的情况是,当我使用标头调用资源服务时,我可以看到网关中发生了成功的身份验证,并且正在创建会话,但是由于会话在其之后不在 Redis 中,因此我在资源中收到 403已通过 zuul 路由。
但是,如果我收到错误,请获取会话 ID 并将其添加到标头,然后重试,它会起作用,因为现在我的经过身份验证的会话在路由后可用于资源项目。
请有人指出我如何通过网关接收呼叫以在同一请求中进行身份验证和路由?
谢谢
贾斯汀
我关注了贾斯汀·泰勒在不同页面上的帖子,所以这是他的解决方案。我在这里使用源代码解决方案很有意义:
- 让 Spring Session 急切地提交 - 自 spring-session v1.0 起就有注释属性
@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
它立即将会话数据保存到 Redis 中。文档here.
- 用于将会话添加到当前请求标头的简单 Zuul 过滤器:
@Component
public class SessionSavingZuulPreFilter extends ZuulFilter {
@Autowired
private SessionRepository repository;
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpSession httpSession = context.getRequest().getSession();
Session session = repository.getSession(httpSession.getId());
context.addZuulRequestHeader("Cookie", "SESSION=" + httpSession.getId());
log.info("ZuulPreFilter session proxy: {}", session.getId());
return null;
}
}
再说一遍——这不是我的解决方案——证书交给贾斯汀·泰勒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)