Spring Boot OAuth2 单点注销(注销)
Posted
技术标签:
【中文标题】Spring Boot OAuth2 单点注销(注销)【英文标题】:Spring Boot OAuth2 Single Sign Off (Logout) 【发布时间】:2017-08-21 15:13:15 【问题描述】:我正在考虑为我的应用程序使用 OAuth2。我正在尝试实现的架构如下:
我将拥有自己的(并且只有这个)授权服务器 一些资源应用程序使用授权服务器验证对其资源的访问 某些客户端应用程序(Web、移动)会将用户重定向到授权服务器进行身份验证,成功后将使用资源应用程序上的 api。到目前为止,我已经设法在 3 个基本应用程序(1 个身份验证服务器、1 个资源服务器和 1 个客户端)之间实现了这种交互。我没有工作的是注销功能。我已经阅读了 Dave Syer 在他的教程中描述的"notoriously tricky problem",但在这种情况下,我确实需要用户在注销后重新登录。我尝试给访问令牌和刷新令牌几秒钟,但在到期时没有提示再次登录,而是在客户端应用程序上获得了 NPE。我还尝试了post 中提出的解决方案来从令牌存储中删除令牌,但它不起作用。对我来说,单点注销是此实现的理想行为。如何使用 Spring Boot Oauth2 实现这一点。如果由于某种原因无法实现,我可以使用哪些替代方案来使用 Spring Boot 实现集中式安全性?
提前致谢。
【问题讨论】:
【参考方案1】:经过大量测试,我意识到这可以通过重定向到 AuthServer 并像这样以编程方式注销来解决:
在客户端应用程序(WebSecurityConfigurerAdapter)中:
@Override
protected void configure(HttpSecurity http) throws Exception
http
.logout()
.logoutSuccessUrl("http://your-auth-server/exit");
在授权服务器中:
@Controller
public class LogoutController
@RequestMapping("/exit")
public void exit(HttpServletRequest request, HttpServletResponse response)
// token can be revoked here if needed
new SecurityContextLogoutHandler().logout(request, null, null);
try
//sending back to client app
response.sendRedirect(request.getHeader("referer"));
catch (IOException e)
e.printStackTrace();
我已经发布了一个sample app on github,其中包含此实现的完整示例。
【讨论】:
这个简单的答案让我找到了一个简单的解决方案。 这段代码在做什么?从客户端应用程序(网站)注销从一个授权服务器注销用户?这是否意味着当用户登录多个客户端应用程序时,从其中一个注销会导致从所有客户端应用程序中注销? @eugene 我已经使用 2 个客户端应用程序测试了这个解决方案,当从一个客户端应用程序注销时不会影响另一个。该解决方案的作用是,当您单击注销然后再次单击登录时,您必须重新输入您的凭据。是解决"notoriously tricky problem"的替代方案。 如果我不想从资源服务器注销怎么办?我只想从该资源中注销我的应用程序 @Juan Carlos Mendoza 应该先做哪一个?从客户端或身份验证服务器注销?通过客户端向身份验证服务器发送带有令牌的注销请求,身份验证服务器验证令牌,如果有效注销然后重定向到客户端注销端点,首先从身份验证服务器注销不是更安全吗?以上是关于Spring Boot OAuth2 单点注销(注销)的主要内容,如果未能解决你的问题,请参考以下文章
整合spring cloud云架构 - SSO单点登录之OAuth2.0 登出流程
spring cloud云架构 - SSO单点登录之OAuth2.0 登出流程
Spring Boot JWT Authentication:登录和注销后触发一个方法
Spring Boot/Angular整合Keycloak实现单点登录