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#在-註銷體驗)。 –