Java 弹簧靴OAuth2单次注销(注销)
我正在考虑在我的应用程序中使用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在他的教程中描述的内容,但在这种情况下,我真的需要用户在注销
- 我将拥有自己的(并且只有这个)授权服务器
- 某些资源应用正在使用授权服务器验证对其资源的访问
- 某些客户端应用程序(web、移动)将用户重定向到授权服务器进行身份验证,成功后将使用资源应用程序上的api
提前感谢。经过大量测试后,我意识到,只需重定向到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();
}
}
}