【问题标题】:Spring Security Oauth2 SSO with Zuul Proxy带有 Zuul 代理的 Spring Security Oauth2 SSO
【发布时间】:2016-07-06 03:40:22
【问题描述】:

我正在从Springs excellent security tutorials 修改oauth2-vanilla 示例。 oauth2-vanilla 将 Zuul 代理和 UI 组合到一个应用程序中。我想将 Zuul 代理和 UI 分开。 (Zuul 代理应该充当 API 网关和多个 UI 的反向代理)。

通过zuul代理访问UI时,应该可以在UI和资源后端之间基于Oauth2做SSO。

oauth2-vanilla 看起来像这样

我想搬到这样的地方:

我已经从网关中删除了UI部分,并为ui添加了一个zuul路由

zuul:
  routes:
    resource:
      url: http://localhost:9000
    user:
      url: http://localhost:9999/uaa/user
    ui:
      url: http://localhost:8080

我创建了一个新的 UI webapp,其中包含带有 @EnableOAuth2Sso 注释的 UI(Angular 的东西)。

所以我通过http://localhost:8888(通过zuul 代理)访问用户界面。 在通过 UI 流程进行身份验证和操作后,我可以访问返回用户的 /user 端点。 (在调试期间,我看到当我访问 /user 端点时,我有一个带有 OAuth2Authentication 的 HTTP 会话。

但是,当我访问 /resource 端点时,HttpSessionSecurityContextRepository 找不到会话并且无法使用 OAuth2Authentication 构建上下文。

我使用修改后的示例创建了a git repository

我猜网关配置有问题。 我尝试更改 cookie 路径,更改代理中的 HttpSecurity 规则,但我无法让它工作。

我不明白为什么 UI 在通过代理访问时能够很好地解析 /user 端点(使用 HTTP 会话和 OAuth2Authentication),但无法访问 /resource 端点.

另外,由于 UI 现在在 /ui 上下文中运行,看来我需要在网关中有以下代码才能加载角度 css / js 文件。

.antMatchers("/ui/index.html", "/ui/home.html", "ui/css/**", "/ui/js/**").permitAll().anyRequest().authenticated();

我需要用 zuul ui 路由作为前缀似乎也不对。

任何帮助将不胜感激。

【问题讨论】:

  • 为什么你的用户界面有@EnableOAUth2Sso?我原以为将其视为资源服务器(@EnableResourceServer)更自然(假设您已经在网关上拥有该注释)。我想这也是我们在 gitter 上得出的结论。
  • 关于“/resource”:问题可能是您不包括“spring-cloud-starter-security”。据我了解,它执行会话和访问令牌之间的实际匹配,并根据浏览器会话 ID 转发访问令牌。我知道我以前遇到过这个问题。
  • 我认为网关(zuul)进行匹配。根据浏览器通过 cookie 发送的 sessonId,网关可以找到相应的访问令牌并将其传递给资源。
  • 我也遇到了同样的问题,你最后成功了吗?一个我不清楚的问题,如果 zuul 有 sso,那么每个客户端如何使用不同的 client-id/secret?
  • @DaveSyer 你找到解决方案了吗?我也面临同样的问题。

标签: spring spring-security spring-cloud spring-security-oauth2


【解决方案1】:

我一直无法让@EnableOauthSso 工作。相反,我注释为 @EnableResourceServer 并为 Zuul 创建了一个安全配置。

@Configuration
@EnableResourceServer
public class JwtSecurityConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/oauth/**").permitAll()
            .antMatchers("/**").hasAuthority("ROLE_API")
            .and()
            .csrf().disable();
    }
}

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 2015-07-15
    • 2015-11-23
    • 2016-10-06
    • 2013-03-28
    • 2018-06-27
    • 2017-12-16
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多