Java 弹簧靴OAuth2单次注销(注销)

Java 弹簧靴OAuth2单次注销(注销),java,spring,spring-boot,spring-security,spring-security-oauth2,Java,Spring,Spring Boot,Spring Security,Spring Security Oauth2,我正在考虑在我的应用程序中使用OAuth2。我尝试实现的体系结构如下所示: 我将拥有自己的(并且只有这个)授权服务器 某些资源应用正在使用授权服务器验证对其资源的访问 某些客户端应用程序(web、移动)将用户重定向到授权服务器进行身份验证,成功后将使用资源应用程序上的api 到目前为止,我已经成功实现了3个基本应用程序(1个身份验证服务器、1个资源服务器和1个客户端)之间的交互。我没有得到的东西是注销功能。我已经读过DaveSyer在他的教程中描述的内容,但在这种情况下,我真的需要用户在注销

我正在考虑在我的应用程序中使用OAuth2。我尝试实现的体系结构如下所示:

  • 我将拥有自己的(并且只有这个)授权服务器
  • 某些资源应用正在使用授权服务器验证对其资源的访问
  • 某些客户端应用程序(web、移动)将用户重定向到授权服务器进行身份验证,成功后将使用资源应用程序上的api
到目前为止,我已经成功实现了3个基本应用程序(1个身份验证服务器、1个资源服务器和1个客户端)之间的交互。我没有得到的东西是注销功能。我已经读过DaveSyer在他的教程中描述的内容,但在这种情况下,我真的需要用户在注销后重新登录。我尝试过给访问令牌和刷新令牌几秒钟的时间,但是当到期时,我没有被提示再次登录,而是在客户端应用程序上得到了一个NPE。我还尝试了本文中提出的解决方案,从令牌存储中删除令牌,但它不起作用。对我来说,单签核是这个实现的理想行为。如何使用Spring Boot Oauth2实现这一点。如果由于某种原因无法实现,我可以使用哪些替代方案来实现使用Spring Boot的集中式安全性


提前感谢。

经过大量测试后,我意识到,只需重定向到AuthServer并以编程方式注销即可解决此问题,如下所示:

  • 在客户端应用程序(WebSecurity配置适配器)中:

  • 在授权服务器中:

    @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();
            }
        }
    }
    

我已经发布了一个完整的实现示例。

这个简单的答案让我找到了一个简单的解决方案。这段代码在做什么?从客户端应用程序(网站)注销将用户从一个授权服务器注销?这是否意味着当用户登录到多个客户端应用程序时,从其中一个客户端注销会导致从所有客户端应用程序注销?@eugene我已使用两个客户端应用程序测试了此解决方案,并且从一个客户端应用程序注销不会影响另一个客户端应用程序。此解决方案的作用是,当您单击注销,然后再次单击登录时,您必须重新输入您的凭据。是解决问题的替代方法。如果我不想从资源服务器注销怎么办?我只想注销我的应用程序resource@Juan卡洛斯·门多萨:应该先做哪一个?从客户端或身份验证服务器注销?首先从身份验证服务器注销不是更安全吗?客户端使用令牌向身份验证服务器发送注销请求,身份验证服务器验证令牌是否有效,然后重定向到客户端注销端点?
@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();
        }
    }
}