首先配置認證服務器,隨便定義幾個客戶端
接下來是tokenStore,我這里使用redis
當然,在此之前,已經配置了好了spring security,這是前提,在這里只著重介紹下oauth2相關配置。
服務端搞定后就是客戶端,完成一個,第二個再copy第一個就行了。由于客戶端需要訪問服務端,所以需要配置一個oauth2的restTemplate,而OAuth2RestTemplate需要一個OAuth2ProtectedResourceDetails以及OAuth2ClientContext,配置如下:
這里使用的授權碼模式(密碼模式一跑起來就死循環,還沒弄清原因),注意,上圖中的OAuth2ClientContextFilter由@EnableOAuth2Client注解帶來的,在springboot中,實現這些功能,一個@EnableOAuth2Sso就搞定了,感覺把所有一切都屏蔽了,個人不是很喜歡,目前springboot2好像將此注解去掉了。 接下來還要注冊一個OAuth2ClientAuthenticationProcessingFilter,此過濾器就是專門處理某一個請求來獲取token,這個請求默認為login
OAuth2ClientAuthenticationProcessingFilter注冊后還要在configure方法中添加一下(上上張圖中),當然,還需要一個和服務端一樣的tokenStore。這時就差不多配置好了,將這個client的項目再拷一份,這樣就有兩個client。然后,依次啟動server,client1,client2。訪問client1時會被重定向到服務端進行登錄:
登錄后進入授權頁面(如果不想要這一步,在認證服務器的client配置中添加autoApprove(true)即可):
授權后client1獲取授權碼,在OAuth2ClientAuthenticationProcessingFilter中會拿此授權碼去server的tokenEndpoint請求token,獲取后,通過token拿到Authentication,spring security上下文會被填充,完成認證,訪問資源。這時再去請求client2的資源,被重定向到server后,由于server在當前瀏覽器已完成認證,session中可以拿到Authentication,于是,直接獲取授權碼,然后拿到token,不需要再重復登錄,直接訪問到資源了!!!