<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [TOC] # **認證中心* auth-server* auth-server在項目中的位置 ![](https://img.kancloud.cn/fe/7a/fe7ac9108d57ec9d64e8d7d55fe5763b_1006x660.png) auth-server在項目用的作用 ![](https://box.kancloud.cn/67e561ea8cb7eeab5f62d74f4956a5ab_1064x532.png) ## 認證服務器頒發token核心流程 * /oauth/token?grant_type=password #請求授權token * /oauth/token?grant_type=refresh_token #刷新token * /oauth/check_token #校驗token * /oauth/authorize #授權碼模式 ## OAUTH 核心處理調用關系 ![](https://box.kancloud.cn/153c89b5bdf9cef58e6bf51005624413_857x461.png) ## 認證流程圖 ![](https://box.kancloud.cn/61db9c23a4af534a31da34b273fedb9b_927x531.png) ## Spring Security Oauth基本設計 ![](https://img.kancloud.cn/f3/4f/f34faab4ebaa42a7b18e895474f54332_1101x517.png) * 訪問者(Accessor)需要訪問某個資源(Resource)是這個場景最原始的需求,但并不是誰都可以訪問資源,也不是任何資源都允許任何人來訪問,所以中間我們要加入一些檢查和防護 * 在訪問資源的所經之路上,可能遇到細菌,病毒,不管怎么樣,對于要防護的資源來說最好的方法就是設關卡點,對于上圖的FilterSecurityInvation,MethodIncation,Jointpoint,這些在spring security oauth中統稱SecuredObjects * 我們知道在哪里設置關卡點最合適,下一步就是設置關卡,對應FileSecurityInterceptor,MethodSecurityInterceptor,AspectSecurityInterceptor, 這些關卡統一的抽象類是AbstractSecurityInterceptor * 有關卡點,關卡了以后,到底誰該攔截誰不應該呢,spring security oauth中由 AccessDecisionManager控制 * 最后一個問題,這個誰怎么定義,我們總得知道當前這個訪問者是誰才能告訴AccessDecisionManager攔截還是放行,在spring security oauth框架中AuthenticationManager將解決訪問者身份認證問題,只有確定你在冊了,才可以給授權訪問。AuthenticationManager,AccessDecisionManager,AbstractSecurityInterceptor屬于spring security框架的基礎鐵三角。 * 有了以上骨架,真正執行防護任務的其實是SecurityFilterChain中定于的一系列Filter,其中ExceptionTranslationFilter,它負責接待或者送客,如果訪問者來訪,對方沒有報上名來,那么,它就會讓訪客去登記認證(找AuthenticationManager做認證),如果對方報上名了,但認證失敗,那么請重新認證送客,送客的方式是拋出相應的Exception,所以名字叫做ExceptionTranslationFilter。 * 最后,這個filter序列中可能不滿足我們的需求,比如增加驗證碼,所以我們需要在其中穿插自己的Filter實現類,為定制和擴展Spring Security Oauth的防護體系。 * spring security內置的filter序列 ![](https://img.kancloud.cn/5f/30/5f3006bb1d84ed61dbd12c71ec4c5099_1811x888.png) * 執行過濾鏈 ![](https://img.kancloud.cn/22/bc/22bcdefc6698fc9f5a5e7535566aa2dc_1270x348.png) ## AuthorizationServerEndpointsConfiguration ### 授權碼 ![](https://img.kancloud.cn/be/3c/be3c89bc44445138d5ae0e41b81155ef_1707x782.png) ### 密碼 ![](https://img.kancloud.cn/75/75/7575d2b703c5870019126b14125bff2e_1482x340.png) 根據以上流程重寫了密碼模式,(僅用來學習流程,并沒有真正調用) ![](https://img.kancloud.cn/27/99/2799f66d19f34fe5e9f747ee609e32b0_1696x702.png) 根據以上流程重寫了客戶端模式(僅用來學習流程,并沒有真正調用) ![](https://img.kancloud.cn/b1/39/b13974faa7ff9bb863f9187af7187705_1315x426.png) ## auth-server作為一個認證服務器,引入uaa-server-spring-boot-starter ![](https://img.kancloud.cn/5c/c7/5cc78590b1cb6a723e0681c9ce2e904e_1552x622.png) ### 引入oauth的以下模式 * 簡易模式 * 客戶端模式 * 密碼模式 * 授權碼模式 * 刷新模式 * 短信模式 ## auth-server核心表 oauth_client_details --> JdbcClientDetailsService 處理 ![](https://box.kancloud.cn/35a46621f0574c3e6165dda495e416c1_1916x543.png) 應用管理 com.open.capacity.uaa.controller.SysClientController ![](https://img.kancloud.cn/5c/89/5c89ad9b23a3d7abd43a97f9fade13a1_1533x706.png) 在auth-server啟動時,會把oauth_client_details 的數據加載到redis中,在oauth申請令牌時,會通過org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter中的attemptAuthentication方法校驗應用以及密鑰 ## 服務管理 com.open.capacity.uaa.controller.SysServiceController * sys_service 服務表 * sys_client_service 應用服務表 ![](https://img.kancloud.cn/0f/25/0f257fd44833670d3fecf4ab422ea9b5_1835x700.png) ## token列表 com.open.capacity.uaa.controller.OAuth2Controller.getTokenList(Map<String, Object>) redis scann獲取在線用戶的token列表 ![](https://img.kancloud.cn/6a/cc/6accc642c637a40f792934a1abb33680_1818x669.png) ## auth-server 自定義用戶驗證邏輯 處理密碼模式中的用戶名密碼獲取 ![](https://img.kancloud.cn/1b/98/1b983dc2d653043bd63a294acf7166ff_1679x784.png) feign聲明調用用戶中心,獲取sys_user表中的用戶信息 ![](https://box.kancloud.cn/8b0f61a737fa07e771f61d6678b8c65a_1752x726.png) 原理部分[28.服務間調用](29.%E6%9C%8D%E5%8A%A1%E9%97%B4%E8%B0%83%E7%94%A8.md) ### 啟動user-center后測試auth-server的密碼模式 ![](https://img.kancloud.cn/86/1d/861d40a358dbfa865d3b99dc8d30e8ed_1917x780.png) **如果是客戶端模式,可以通過swagger測試** 訪問認證中心地址http://130.75.131.208:8000/api-auth/doc.html ![](https://img.kancloud.cn/30/e9/30e9e6537c5af35b0388c02bd69bdb22_1920x803.png) 需要帶上token,否則無法訪問auth-server的資源 ![](https://img.kancloud.cn/13/e9/13e97782cf3b796920bd983223b164a3_1919x787.png) 需要帶上token,正確訪問 ![](https://img.kancloud.cn/67/f7/67f703e039550cdf058d748a77bd5be4_1920x734.png) ## 權限訪問白名單 ### 配置文件 ![](https://box.kancloud.cn/141d93cff0be2656f6310faa239a43cd_1742x673.png) ### 處理類 ![](https://img.kancloud.cn/24/bd/24bdaee394247dc160e89b76e2715ab2_1656x676.png) ### 處理/oauth/authorize 核心類AuthorizationEndpoint ![](https://box.kancloud.cn/d970243ea0fac42f0784d4e7a2895dec_1118x678.png) #### 授權碼模式 * 獲取授權碼 (http://127.0.0.1:8000/api-auth/oauth/authorize?client_id=owen&redirect_uri=http://127.0.0.1:9997/dashboard/login&state=abc&scope=app&response_type=code) * 跳轉統一登錄頁面,登錄成功獲取授權碼 ![](https://img.kancloud.cn/56/e2/56e2409077b22173ea9102f2fab47384_1918x461.png) * 用授權碼換token ![](https://img.kancloud.cn/30/ba/30bab4f598230a47349bedf8b425dd9f_1711x512.png) #### 密碼模式 >[info]基本流程就是: 通過ClientDetailsSevice根據ClientId查找對應的Client,由Oauth2RequestFactory生成TokenRequest。檢查是否能對應的找到Client,沒有就拋出異常。 檢查參數,都沒問題了最后就調用Ganter的grant方法來生成Token并返回。輸入參數,即用戶提供username,password,clientId,clientSecret,grantType=password等信息,請求/oauth/token,獲得access_token,用戶即可通過access_token訪問資源 訪問/oauth/token >[info]對應代碼處理流程 此時FilterChainProxy的filter順序如下。重要的Filter有ClientCredentialsTokenEndpointFilter和BasicAuthenticationFilter,前者從request parameters中抽取client信息,后者從header Authorization Basic XXXX中抽取client信息。 80端口是nginx負載的網關,測試可以改成9200 ![](https://box.kancloud.cn/c2da6efd9ac36097796aafc414f93246_1648x843.png) >[info]**ClientCredentialsTokenEndpointFilter**會從parameter中抽取client_id,client_secret信息,并進行client的身份驗證。 ![](https://box.kancloud.cn/ba4b7bf3c47c4dc5459d4192259e9fc8_833x494.png) ![](https://box.kancloud.cn/9963569242229cd877dd1abb6a522b2a_912x739.png) >[info] 訪問/oauth/token,都事先驗證了client信息,并作為authentication存儲在SecurityContextHolder中。傳遞到TokenEndPoint的principal是client,paramters包含了user的信息和grantType。 ### 處理/oauth/token核心類TokenEndpoint ![](https://box.kancloud.cn/95a0c28a24999a030093a8ca832980d8_1206x532.png) ### 認證流程圖 ![](https://box.kancloud.cn/cd129821b9eb34b2145923e976062188_961x683.png) #### security認證原理 >[info] 認證的工作是交給AuthenticationManager去做,AuthenticationManager下有多個認證器 AuthenticationProvider 只要其中一個AuthenticationProvider通過認證就算登陸成功,而且在認證器中拋出異常,無法終止認證流程只是算該認證器未通過。 第一個config就算配置了一個AuthenticationManagerBuilder 這個類會生成一個 AuthenticationManager和DaoAuthenticationProvider認證器,認證調用userdetailservice 的loadUserByUsername方法來和你傳入的username passworde做比較,password 是通過BCryptPasswordEncoder來做編碼后比較的,這樣做是為了提高安全性。 ## 通過arthas理解OAUTH密碼模式 * 端點過濾器TokenEndpointAuthenticationFilter * 端點對應的action類TokenEndpoint * 受保護的資源信息類ResourceOwnerPasswordResourceDetails * 和認證服務器交互資源信息類ResourceOwnerPasswordAccessTokenProvider ![](https://box.kancloud.cn/c166a2246d88ca8cc31b64f7d32a77f6_1563x394.png) ![](https://box.kancloud.cn/b73ab6847f26a3fc8e545ac8d8360ab0_1547x314.png) ![](https://box.kancloud.cn/a2e57bed6f98c43750f8b9d782ceb134_1548x127.png) ## 代碼分析 ![](https://img.kancloud.cn/b7/67/b767e7d66c6d0c16c6b78465553cd87a_663x420.png) ### 認證授權效果圖 注意可能訪問是:8000/api-auth/doc.html,項目更新版本增加了相對路徑,此處沒有更新 ![](https://box.kancloud.cn/abab658b5e65084b2aead66130dc90f6_1922x950.gif) ### redis token 結構 ``` 排除refresh_token,主要key如下: * auth_to_access:OAuth2Authentication相關信息加密后的值,value為string結構 這個主要是通過OAuth2Authentication來獲取OAuth2AccessToken * auth:token值,value為string結構 這個主要用來獲取token的OAuth2Authentication,用來獲取相應的權限信息 * client_id_to_access:clientId,value為list結構 這個主要是存儲了每個clientId申請的OAuth2AccessToken的集合 方便用來審計和應急處理跟clientId相關的token * access:token值,value為string 這個主要是通過token值來獲取OAuth2AccessToken * uname_to_access:clientId:userId,value的結構是list 存儲OAuth2AccessToken的集合 主要是為了通過clientId,userId來獲取OAuth2AccessToken集合,方便用來獲取及revoke approval ``` ### 監控redis 的操作情況 ``` D:\soft\redis>redis-cli.exe -h 59.110.164.254 -p 6379 59.110.164.254:6379> select 2 OK 59.110.164.254:6379[2]> monitor ``` ![](https://img.kancloud.cn/b5/f5/b5f5b1b7625fe5ca5b98b2908f17f4a2_1598x535.png) ## 項目pom版本依賴 ![](https://img.kancloud.cn/8f/d3/8fd39b9edd8752e85ecabff3f65cac07_644x413.png) 左側2.0.x版本 左側1.5.9版本差異 ![](https://box.kancloud.cn/6c10f0c1ae40e1bdbf5ba48f35fb1f4b_920x816.png) # 認證中心的**另一種選擇***keycloak* ![](https://img.kancloud.cn/e9/f2/e9f285e1b267ad31ce26e1d02df373e6_1392x754.png) ## 簡介 Keycloak 為現代應用和分布式服務提供了一套完整的認證授權管理解決方案,它是開源的,是一個獨立的認證授權服務器。它主要是基于OAuth2協議的實現,同時提供了多種語言庫,讓我們可以很快速地根據我們的需求將Keycloak集成到我們的項目中去使用。 Keycloak功能: * 是一個獨立的認證授權服務器,提供完整的認證授權解決方案 * 主要基于OpenID-Connect & SAML協議 * 基本的登錄注冊,以及登錄注冊頁面主題自定義 * 很人性化的用戶界面管理,比如用戶、角色、session、Clients等等的管理 * 具有獨立的數據庫,用于存儲用戶等認證授權數據 * 支持聯合數據存儲,比如集成Ldap服務器;提供SPI擴展,比如user Storage SPI,可以讓用戶的一部分數據存儲在你自己的數據庫,一部分存儲在keycloak自己的數據庫 * 提供多種語言庫集成keycloak * 提供管理API,用于管理keycloak中所有的認證授權對象 * Docker-compose一鍵安裝,同時windows解壓版解壓后即可使用 ## 安裝 解壓版安裝 – 下載地址:[ https://downloads.jboss.org/keycloak/11.0.3/keycloak-11.0.3.zip]() https://www.keycloak.org/downloads – 默認是使用H2數據庫存儲數據,如果你想要換成其他數據庫可以參考: [https://www.cnblogs.com/ifme/p/12588910.html]() 解壓目錄如下 ![](https://img.kancloud.cn/27/7a/277ab8366afde2e592ba483890287032_597x849.png) ## 啟動服務器 Keycloak提供多種模式啟動,standalone單機啟動,domain集群啟動。我們這里使用單機啟動,進去到bin目錄,找到standalone.bat, 雙擊啟動。啟動后訪問 http://localhost:8080,正常訪問說明啟動成功,如下: ![](https://img.kancloud.cn/0d/85/0d85ce6b35c14f4380a0519cd785c28f_1553x662.png) 點擊Administration Console, 第一次需要給admin用戶創建密碼。 docker-compoe安裝 – Docker安裝:[ https://github.com/keycloak/keycloak-containers/tree/master/docker-compose-examples]() 安裝使用很簡單,這里就累述了。 專有名詞 & 基本使用 當你啟動的keyclaok服務器,然后使用admin賬號登錄以后,進去到keycloak管理頁面: ![](https://img.kancloud.cn/28/ac/28ac00972e62fc9f74b2af7b37690a6d_1581x810.png) 這是Master Realm的settings頁面,Master Realm是keycloak默認有的realm,顧名思義就是用于管理的realm,例如admin這個用戶就是屬于這個realm: ![](https://img.kancloud.cn/fd/7f/fd7fbd70a8dfb6b97d814c02e52311ae_1445x763.png) 那Realm是什么意思呢?Realm字面意思是領域可以理解為一個租戶,指的是在某一個軟件業務領域中所涉及的用戶認證授權管理相關的對象,在這個realm下有用戶、角色、會話(session)等等用于認證授權管理的對象。 假設一個公司A使用一個ERP系統,那么就可以給這個公司A設置一個Realm,用于該公司所有員工的授權管理。那么如果另一個公司B也使用這個ERP系統(假設這個ERP系統是第三方提供給所有公司使用的一個ERP服務,就需要給公司B也創建一個Realm,用于公司B員工的授權管理。 所以Realm之間的相互隔離的一個業務領域概念。 創建一個Realm ![](https://img.kancloud.cn/a3/13/a31366befd99070675409a9439e5da82_1189x787.png) 設置一個名字,然后你就可以給你自己的realm設置各種對象了。比如創建用戶,創建一個角色,給用戶授予角色等等。 例如:我創建一個USER的角色,創建一個testuser01用戶,然后給這個用戶授予USER角色: ![](https://img.kancloud.cn/db/b6/dbb678198e18592108836b34e4d57647_1542x737.png) 界面使用非常簡單,大家探索一下就行了。 集成Keycloak ![](https://img.kancloud.cn/5e/1e/5e1e691972471f2b49a5177f9fdeb468_1251x761.png) 假設我們有兩個web服務器,我們需要使用keycloak來對我們的資源進行保護,只有用戶登錄以后才能訪問到這兩個服務器的資源,否則就要跳轉到登錄頁面。所以我們要在兩個服務之前加一個gateway層,在這一層對用戶請求進行攔截,驗證用戶是否已經登錄(了解OAuth2的話,就知道這里就是驗證accessToken),如果沒有的話,就要引導用戶去到keycloak登錄頁面,認證以后再跳轉回到要訪問的頁面。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看