6

我正在考虑为我的应用程序使用OAuth2。我想实现的架构如下:Spring引导OAuth2单一登录(注销)

  • 我会有我自己的(和仅此)授权服务器
  • 一些资源应用程序使用授权服务器
  • 某些客户端验证访问其资源将用户重定向到Authorization Server以进行身份​​验证和成功的应用程序(web,mobile)将消耗资源应用程序上的api。

到目前为止,我已经设法实现了3个基本应用程序(1个auth服务器,1个资源服务器和1个客户端)之间的这种交互。我不能工作的是注销功能。我读过Dave Syer在他的教程中描述的"notoriously tricky problem",但在这种情况下,我真的需要用户在注销后重新登录。我已经尝试给访问令牌和刷新令牌几秒钟,但是当到期到期时不再提示再次登录,我在客户端应用程序中获得了NPE。我也尝试了在此post中提出的解决方案,以从令牌存储中删除令牌,但它不起作用。单次签名对我来说是这个实现的理想行为。我如何使用Spring Boot Oauth2来实现这一点。如果由于某种原因无法实现,那么我可以使用哪种替代方法来实现使用Spring Boot的集中安全性?

在此先感谢。

回答

7

经过大量的我已经意识到,这可能只是一个重定向到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这个实现的完整示例。

+1

这个简单的答案让我成为一个简单的解决方案。 –

+0

这段代码在做什么?从客户端应用程序(网站)登出从一个授权服务器注销用户?这是否意味着当用户登录到多个客户端应用程序时,从其中一个应用程序注销会导致从所有客户端应用程序注销? – eugene

+0

@eugene我已经使用2个客户端应用程序测试过这个解决方案,并且从一个注销时不会影响另一个。此解决方案所做的是,当您单击注销并再次单击登录时,您必须重新输入凭据。是解决[[臭名昭着的棘手问题]]的替代方法](https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v#在-注销体验)。 –