spring-boot 1.3-M5 oauth2 SSO 不适用于 spring-session?
spring-boot 1.3-M5 oauth2 SSO does not work with spring-session?
基本上我无法让 spring-boot oauth2 集成与 spring-session 一起工作。
我在 spring-boot 的问题跟踪器中创建了一个问题:
https://github.com/spring-projects/spring-boot/issues/4360
我做了一个 repo 来演示这个问题
https://github.com/sloppycoder/spring-session-oauth-problem
有 2 个模块:
- auth-server 是oauth2授权服务器。到运行吧,就
mvn
。服务器将位于 http://localhost:19999/uaa
- web-app 是使用 auth-server 进行单点登录的 web 应用程序。
mvn
将在 http://localhost:8080 启动应用程序
我的 sso 注销逻辑是这样工作的:
- 单击 "Logout" 按钮将在成功注销后执行 POST 到 http://localhost:19999/uaa/logout, with passing the URL to redirect to, http://localhost:8080/ssologout。
- auth-server 注销并重定向到 http://localhost:8080/ssologout
- http://localhost:8080/ssologout 然后 POST 到 http://localhost:8080/logout
- (默认spring-安全行为)注销后,重定向到http://localhost:8080/login?logout
- http://localhost:8080/login?logout 重定向到 http://localhost:19999/uaa/login 并提示用户再次登录。
但是在我引入 spring-session 之后,第 5 步没有发生。浏览器直接进入 web-app /dashboard.
确保在 运行启用 sos-spring-session 分支之前启动本地 redis 守护进程。
我创建了 2 个分支来显示不同的行为:
- 仅限sso。 spring-boot 与 auth-server 集成,一切正常。
- sso-spring-课程。注销不起作用。
github compare 显示差异。
对于如何解决此问题的任何意见和建议,我将不胜感激。
我在 spring-boot 1.3.0.RC1、spring-session 和 redis 上遇到了类似的问题。
spring-boot 1.3.0.RC1 : ClassCastException in getting oauth2 user info from session persisted in Redis
如果您将过滤器顺序更改为
,它可能会起作用
'requestContextFilter' < 'OAuth2ClientContextFilter' < 'springSessionRepositoryFilter'
@Bean
@ConditionalOnMissingBean(RequestContextFilter.class)
public RequestContextFilter requestContextFilter() {
return new RequestContextFilter();
}
@Bean
public FilterRegistrationBean requestContextFilterChainRegistration(
@Qualifier("requestContextFilter") Filter securityFilter) {
FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
registration.setName("requestContextFilter");
// note : must previous order of oAuth2ClientContextFilter
registration.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 1);
return registration;
}
@Bean
public FilterRegistrationBean sessionRepositoryFilterRegistration(
SessionRepositoryFilter sessionRepositoryFilter) {
FilterRegistrationBean registration = new FilterRegistrationBean(sessionRepositoryFilter);
registration.setName("springSessionRepositoryFilter");
// note : must following order of oAuth2ClientContextFilter
registration.setOrder(Integer.MAX_VALUE - 1);
return registration;
}
您可能还需要删除依赖项org.springframework.boot:spring-boot-devtools
与https://github.com/spring-projects/spring-boot/issues/3805相关
后记:对于spring-boot 1.3.3.RELEASE
spring-session, redis, spring-security-oauth2 在过滤顺序下工作。
# logs on bootRun task
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'springSessionRepositoryFilter' to: [/*]
Mapping filter: 'requestContextFilter' to: [/*]
Mapping filter: 'OAuth2ClientContextFilter' to: [/*]
Mapping filter: 'springSecurityFilterChain' to: [/*]
Mapping servlet: 'dispatcherServlet' to [/]
当前所需的设置如下。
@Bean
@ConditionalOnMissingBean(RequestContextFilter.class)
public RequestContextFilter requestContextFilter() {
return new RequestContextFilter();
}
@Bean
public FilterRegistrationBean requestContextFilterChainRegistration(
@Qualifier("requestContextFilter") Filter securityFilter) {
FilterRegistrationBean registration =
new FilterRegistrationBean(securityFilter);
registration.setName("requestContextFilter");
// note : must to be following order of springSessionRepositoryFilter
registration.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 1);
return registration;
}
该代码存在很多问题,但阻止它与 Spring Session 一起工作的问题是这两个应用程序正在共享一个 cookie。 "main" webapp 的上下文路径是“/”,因此身份验证服务器在同一主机上 运行 时会尝试使用相同的 cookie。当您使用本地会话时并不重要,但是当您使用分布式会话时,当 2 个应用程序尝试共享同一会话时,您会弄乱状态。您可以通过在网络应用程序中使用 server.context-path
(例如 /app
)并对您的 HTML 等进行相应的更改来修复它,以确保浏览器按照路径回到那里。
基本上我无法让 spring-boot oauth2 集成与 spring-session 一起工作。
我在 spring-boot 的问题跟踪器中创建了一个问题: https://github.com/spring-projects/spring-boot/issues/4360
我做了一个 repo 来演示这个问题
https://github.com/sloppycoder/spring-session-oauth-problem
有 2 个模块:
- auth-server 是oauth2授权服务器。到运行吧,就
mvn
。服务器将位于 http://localhost:19999/uaa - web-app 是使用 auth-server 进行单点登录的 web 应用程序。
mvn
将在 http://localhost:8080 启动应用程序
我的 sso 注销逻辑是这样工作的:
- 单击 "Logout" 按钮将在成功注销后执行 POST 到 http://localhost:19999/uaa/logout, with passing the URL to redirect to, http://localhost:8080/ssologout。
- auth-server 注销并重定向到 http://localhost:8080/ssologout
- http://localhost:8080/ssologout 然后 POST 到 http://localhost:8080/logout
- (默认spring-安全行为)注销后,重定向到http://localhost:8080/login?logout
- http://localhost:8080/login?logout 重定向到 http://localhost:19999/uaa/login 并提示用户再次登录。
但是在我引入 spring-session 之后,第 5 步没有发生。浏览器直接进入 web-app /dashboard.
确保在 运行启用 sos-spring-session 分支之前启动本地 redis 守护进程。
我创建了 2 个分支来显示不同的行为:
- 仅限sso。 spring-boot 与 auth-server 集成,一切正常。
- sso-spring-课程。注销不起作用。
github compare 显示差异。
对于如何解决此问题的任何意见和建议,我将不胜感激。
我在 spring-boot 1.3.0.RC1、spring-session 和 redis 上遇到了类似的问题。
spring-boot 1.3.0.RC1 : ClassCastException in getting oauth2 user info from session persisted in Redis
如果您将过滤器顺序更改为
,它可能会起作用'requestContextFilter' < 'OAuth2ClientContextFilter' < 'springSessionRepositoryFilter'
@Bean
@ConditionalOnMissingBean(RequestContextFilter.class)
public RequestContextFilter requestContextFilter() {
return new RequestContextFilter();
}
@Bean
public FilterRegistrationBean requestContextFilterChainRegistration(
@Qualifier("requestContextFilter") Filter securityFilter) {
FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
registration.setName("requestContextFilter");
// note : must previous order of oAuth2ClientContextFilter
registration.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 1);
return registration;
}
@Bean
public FilterRegistrationBean sessionRepositoryFilterRegistration(
SessionRepositoryFilter sessionRepositoryFilter) {
FilterRegistrationBean registration = new FilterRegistrationBean(sessionRepositoryFilter);
registration.setName("springSessionRepositoryFilter");
// note : must following order of oAuth2ClientContextFilter
registration.setOrder(Integer.MAX_VALUE - 1);
return registration;
}
您可能还需要删除依赖项org.springframework.boot:spring-boot-devtools
与https://github.com/spring-projects/spring-boot/issues/3805相关
后记:对于spring-boot 1.3.3.RELEASE
spring-session, redis, spring-security-oauth2 在过滤顺序下工作。
# logs on bootRun task
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'springSessionRepositoryFilter' to: [/*]
Mapping filter: 'requestContextFilter' to: [/*]
Mapping filter: 'OAuth2ClientContextFilter' to: [/*]
Mapping filter: 'springSecurityFilterChain' to: [/*]
Mapping servlet: 'dispatcherServlet' to [/]
当前所需的设置如下。
@Bean
@ConditionalOnMissingBean(RequestContextFilter.class)
public RequestContextFilter requestContextFilter() {
return new RequestContextFilter();
}
@Bean
public FilterRegistrationBean requestContextFilterChainRegistration(
@Qualifier("requestContextFilter") Filter securityFilter) {
FilterRegistrationBean registration =
new FilterRegistrationBean(securityFilter);
registration.setName("requestContextFilter");
// note : must to be following order of springSessionRepositoryFilter
registration.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 1);
return registration;
}
该代码存在很多问题,但阻止它与 Spring Session 一起工作的问题是这两个应用程序正在共享一个 cookie。 "main" webapp 的上下文路径是“/”,因此身份验证服务器在同一主机上 运行 时会尝试使用相同的 cookie。当您使用本地会话时并不重要,但是当您使用分布式会话时,当 2 个应用程序尝试共享同一会话时,您会弄乱状态。您可以通过在网络应用程序中使用 server.context-path
(例如 /app
)并对您的 HTML 等进行相应的更改来修复它,以确保浏览器按照路径回到那里。