文章代碼地址:連接描述能夠下載直接運行,基於springboot2.1.5,springcloud Greenwich版本實現git
該系列分爲兩個部分:分爲內存實現,數據庫實現。其中數據庫實現採用RBAC權限角色管理。github
首先聲明oauth2是一種協議規範,spring-security-oauth2是對他的一種實現。其次,還有shiro實現,本身根據規範編寫代碼的實現方式。主流的qq,微信等第三方受權登陸方式都是基於oauth2實現的。
oauth2的認證方式有受權碼,簡單,帳戶密碼,客戶端等方式,具體請自行百度不作過多的闡述。 本文基於受權碼方式實現
oauth生態設計的範圍很大,能夠說是一種解決方案,它有「第三方客戶端(web服務,APP服務)」、「用戶」、「認證服務器」、「資源服務器」等部分。認證流程以下圖: web
(A)用戶打開客戶端之後,客戶端要求用戶給予受權。
(B)用戶贊成給予客戶端受權。spring
(C)客戶端使用上一步得到的受權,向認證服務器申請令牌。數據庫
(D)認證服務器對客戶端進行認證之後,確認無誤,贊成發放令牌。springboot
(E)客戶端使用令牌,向資源服務器申請獲取資源。服務器
(F)資源服務器確認令牌無誤,贊成向客戶端開放資源。微信
好了,簡單介紹後,如今開始實現基於內存的認證服務編寫:
(1)使用idea在nacos-test項目中建立authserver-memory模塊。
目錄以下圖: app
(2)建立好module以後,咱們開始配置pom文件加載依賴。
注意:springcloud的版本1.x和2.x差異很大,有不少不兼容,例如jpa1.x的findOne方法在2.x版本中不能使用。由於咱們須要先配置依賴管理 ide
我把spring-cloud-Alibaba一塊兒配置了。好了,如今添加oauth2的依賴,由於咱們使用springcloud,而且springcloud-security爲咱們封裝好了oauth2,
因次咱們只添加這個依賴就能夠
(3)依賴添加完成,下面咱們開始寫代碼,建立config包,由於,咱們認證以前須要先校驗用戶的帳戶密碼是否正確,因此咱們先配置WebSecurityConfig攔截:
在config方法裏,咱們在內存中,配置了兩個用戶,這裏注意密碼用了BCryptPasswordEncoder進行加密,在springboot2.x中不加密會報錯的。
(4)到這裏,用戶驗證已經完成,咱們建立AuthConfig配置認證攔截處理:
須要添加 @EnableAuthorizationServer註解開啓認證服務,注入加密用的BCryptPasswordEncoder實例。而後,配置須要認證的客戶端,
這裏須要細說一下,首先是client_id表明是哪一個客戶端也就是哪一個APP或者web服務須要認證的,而後是客戶端的secret祕鑰須要加密,
authorizedGrantTypes受權方式指的是受權碼,簡單,客戶端,帳戶密碼等,這裏使用的是受權碼(authorization_code),而後是scopes範圍,
redirectUris重定向地址,就是你的登陸地址,受權後跳轉的地址。
(5)配置application.properties文件:
很簡單,不在多說,如今,咱們啓動應用:
成功,咱們用這個地址進行受權訪問:
http://localhost:9000/oauth/authorize?client_id=client&response_type=code
成功後,跳轉到登陸頁面:
輸入帳戶:admin 密碼: 123456 點登陸
選擇approve點擊Authorize認證
這個code就是受權碼
咱們打開postman用post方式獲取access_token
這個client就是配置的client_id,secret就是配置的secret,返回access_token
ok,基於內存的oauth2實現完成,下一篇基於數據庫的實現。有問題請留言。