在过去的几天里,我一直在高空寻找有关如何执行此操作的决定,最终决定接受失败并寻求帮助!!!!!
我遵循了Dave Syer博士关于Angular和Spring Security的教程,特别是Zuul Proxy作为api网关,并使用带有Redis的Spring Session(https://github.com/spring-guides/tut-spring-security-and-angular-js/tree/master/double#_sso_with_oauth2_angular_js_and_spring_security_part_v)
我遇到的问题是我正在通过带有以下 header 的外部应用程序通过网关调用资源剩余服务:
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访问经过身份验证的 session 。
问题在于, session 似乎仅在请求响应后才提交网关中的redis。所以发生的事情是,当我使用 header 调用资源服务时,可以看到成功的身份验证发生在正在创建的网关和 session 中,但是由于该 session 在其后未处于Redis状态,因此我在资源中收到了403通过zuul路由。
但是,如果出现错误,请获取 session ID并将其添加到标题中,然后重试它,因为路由路由后,我的身份验证 session 现在可用于资源项目。
请有人指出我如何通过网关获得电话以验证和路由同一请求的方向吗?
谢谢
贾斯汀
最佳答案
我在不同页面上关注Justin Taylor的帖子,因此这是他的解决方案。在这里使用源代码解决方案很有意义:
@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
,可将 session 数据立即保存到Redis中。文档here。 @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;
}
}
再说一次-这不是我的解决方案-凭证请到贾斯汀·泰勒(Justin Taylor)。
关于spring-security - 具有Spring Session/Redis的Spring Zuul API网关在同一请求中进行身份验证和路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34751700/