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

标签 spring-security spring-cloud spring-session

在过去的几天里,我一直在高空寻找有关如何执行此操作的决定,最终决定接受失败并寻求帮助!!!!!

我遵循了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的帖子,因此这是他的解决方案。在这里使用源代码解决方案很有意义:

  • 使Spring Session积极提交-自spring-session v1.0起,具有注释属性@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE),可将 session 数据立即保存到Redis中。文档here
  • 用于将 session 添加到当前请求的 header 中的简单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;
        }
    
    }
    

    再说一次-这不是我的解决方案-凭证请到贾斯汀·泰勒(Justin Taylor)。

    关于spring-security - 具有Spring Session/Redis的Spring Zuul API网关在同一请求中进行身份验证和路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34751700/

    相关文章:

    java - 在 spring security 访问被拒绝处理程序中确定所需权限的正确方法

    java - 未应用自定义 Spring Boot 安全性

    java - spring cloud netflix jersey 版本冲突

    java - Spring Session 和 Redis 混合 session

    Spring Security 在用户注销时从数据库中删除 session

    Java Get access token using Client Credentials 授予和存储 token

    java - 即使在确认后,应用程序仍接受来自 google Pub/Sub 的重复消息

    Spring Cloud Gateway 默认路由不起作用

    java - Spring Boot - 如何有条件地启用/禁用 session

    java - 尝试向 Web 服务发送 SOAP 请求时出现 WS 安全错误