基本上我无法使用spring-boot oauth2集成来使用spring-session .
我在spring-boot的问题跟踪器中创建了一个问题:https://github.com/spring-projects/spring-boot/issues/4360
我做了一个回购来证明这个问题
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"按钮将对http://localhost:19999/uaa/logout进行POST,并在成功注销后传递URL重定向到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-sesson . 注销不起作用 .
github compare显示了差异 .
我将很感激有关如何解决这个问题的任何建议和建议 .
2 回答
我在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'
你也可能需要删除依赖
org.springframework.boot:spring-boot-devtools
与https://github.com/spring-projects/spring-boot/issues/3805相关
postscript: for spring-boot 1.3.3.RELEASE
spring-session,redis,spring-security-oauth2在过滤器顺序下工作 .
当前所需的设置如下 .
该代码存在很多问题,但阻止它与Spring Session一起工作的问题是两个应用程序正在共享一个cookie . 对于"main" webapp,上下文路径为"/",因此当auth服务器在同一主机上运行时,尝试使用相同的cookie . 使用本地会话时无关紧要,但是当您使用分布式会话时,当2个应用程序尝试共享同一会话时,您会搞乱状态 . 您可以通过在webapp中使用
server.context-path
(例如/app
)并对HTML等进行相应更改来修复它,以确保浏览器遵循路径返回到那里 .