【发布时间】: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