具有Spring Session/Redis的Spring Zuul API网关在同一请求中进行身份验证和路由

Jus*_*lor 9 spring-security spring-session spring-cloud

过去几天我一直在寻找如何做到这一点的最高点和最低点,并最终决定承认失败并请求帮助,拜托!

我跟随Dave Syer博士关于Angular和Spring Security的教程,特别是Zuul代理作为api网关,并使用Red Session的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)

我遇到的问题是我通过网关从具有以下标头的外部应用程序调用资源休息服务:

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);
Run Code Online (Sandbox Code Playgroud)

要经过身份验证然后由zuul路由,然后通过redis访问资源以访问经过身份验证的会话.

问题是会话似乎只在请求响应后才在网关中提交redis.所以发生的事情是,当我使用标头调用资源服务时,我可以看到在网关和会话中发生了成功的身份验证,但是由于会话之后没有处于redis状态,因此我在资源中获得了403通过zuul路由.

但是,如果我收到错误,请获取会话ID并将其添加到标头并再次尝试,因为现在我的身份验证会话在路由后可用于资源项目.

请有人指出我如何通过网关接听我的电话进行身份验证并在同一请求中路由吗?

谢谢贾斯汀

sho*_*ull 9

我跟随贾斯汀泰勒在不同页面上的帖子,所以这是他的解决方案.在这里有源代码的解决方案让我有意义:

  1. 急切地提交Spring Session - 从spring-session v1.0开始,有一个注释属性@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)可以立即将会话数据保存到Redis中.文档在这里.
  2. 简单的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;
    }

}
Run Code Online (Sandbox Code Playgroud)

再一次 - 这不是我的解决方案 - 凭证给贾斯汀泰勒.