精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Tomcat 容器的安全認證和鑒權

運維 服務器運維
容器和 Web 應用采用的是基于角色的權限訪問控制方式,其中容器需要實現認證和鑒權的功能,而 Web 應用則要實現授權的功能。

 大量的 Web 應用都有安全相關的需求,正因如此,Servlet 規范建議容器要有滿足這些需求的機制和基礎設施,所以容器要對以下安全特性予以支持:

  • 身份驗證:驗證授權用戶的用戶名和密碼
  • 資源訪問控制:限制某些資源只允許部分用戶訪問
  • 數據完整性:能夠證明數據在傳輸過程中未被第三方修改
  • 機密性或數據隱私:傳輸加密(SSL),確保信息只能被信任用戶訪問

本文就以上問題,對 Tomcat 容器提供的認證和鑒權的設計與實現,以及內部單點登錄的原理進行分析。首發于微信公眾號頓悟源碼。

1. 授權

容器和 Web 應用采用的是基于角色的權限訪問控制方式,其中容器需要實現認證和鑒權的功能,而 Web 應用則要實現授權的功能。

[[265756]]

在 Servlet 規范中描述了兩種授權方式:聲明式安全和編程式安全。聲明式安全就是在部署描述符中聲明角色、資源訪問權限和認證方式。以下代碼片段摘自 Tomcat 自帶的 Manager 應用的 web.xml:

  1. <security-constraint> <!-- 安全約束 --> 
  2.   <web-resource-collection> <!-- 限制訪問的資源集合 --> 
  3.     <web-resource-name>HTML Manager commands</web-resource-name
  4.     <url-pattern>/html/*</url-pattern> 
  5.   </web-resource-collection> 
  6.   <auth-constraint><!-- 授權可訪問此資源集合的角色 --> 
  7.      <role-name>manager-gui</role-name
  8.   </auth-constraint
  9. </security-constraint
  10.  
  11. <login-config><!-- 配置驗證方法 --> 
  12.   <auth-method>BASIC</auth-method> 
  13.   <realm-name>Tomcat Manager Application</realm-name
  14. </login-config> 
  15.  
  16. <security-role><!-- 定義一個安全角色 --> 
  17.   <description> 
  18.     The role that is required to access the HTML Manager pages 
  19.   </description> 
  20.   <role-name>manager-gui</role-name
  21. </security-role> 

這些安全相關的配置,都會在應用部署時,初始化和設置到 StandardContext 對象中。更多詳細的內容可查看規范對部署描述文件的解釋,接下來看 Tomcat 怎么設計和實現認證及鑒權。

2. 認證和鑒權的設計

Servlet 規范雖然描述了 Web 應用聲明安全約束的機制,但沒有定義容器與關聯用戶和角色信息之間的接口。因此,Tomcat 定義了一個 Realm 接口,用于適配身份驗證的各種信息源。整體設計的類圖如下:

 

上圖中,包含了各個類的核心方法,關鍵類或接口的作用如下:

  • Realm - 譯為域,域有泛指某種范圍的意思,在這個范圍內存儲著用戶名、密碼、角色和權限,并且提供身份和權限驗證的功能,典型的這個范圍可以是某個配置文件或數據庫
  • CombinedRealm - 內部包含一個或多個 Realm,按配置順序執行身份驗證,任一 Realm 驗證成功,則表示成功驗證
  • LockOutRealm - 提供用戶鎖定機制,防止在一定時間段有過多身份驗證失敗的嘗試
  • Authenticator - 不同身份驗證方法的接口,主要有 BASIC、DIGEST、FORM、SSL 這幾種標準實現
  • Principal - 對認證主體的抽象,它包含用戶身份和權限信息
  • SingleSignOn - 用于支持容器內多應用的單點登錄功能

2.1 初始化

Realm 是容器的一個可嵌套組件,可以嵌套在 Engine、Host 和 Context 中,并且子容器可以覆蓋父容器配置的 Realm。默認的 server.xml 在 Engine 中配置了一個 LockOutRealm 組合域,內部包含一個 UserDatabaseRealm,它從配置的全局資源 conf/tomcat-users.xml 中提取用戶信息。

web.xml 中聲明的安全約束會初始化成對應的 SecurityConstraint、SecurityCollection 和 LoginConfig 對象,并關聯到一個 StandardContext 對象。

在上圖可以看到,AuthenticatorBase 還實現了 Valve 接口,StandardContext 對象在配置的過程中,如果發現聲明了標準的驗證方法,那么就會把它加入到自己的 Pipeline 中。

3. 一次請求認證和鑒權過程

Context 在 Tomcat 內部就代表著一個 Web 應用,假設配置使用 BASIC 驗證方法,那么 Context 內部的 Pipeline 就有 BasicAuthenticator 和 StandardContextValve 兩個閥門,當請求進入 Context 管道時,就首先進行認證和鑒權,方法調用如下:

 

整個過程的核心代碼就在 AuthenticatorBase 的 invoke 方法中:

  1. public void invoke(Request request, Response response) throws IOException, ServletException { 
  2.   LoginConfig config = this.context.getLoginConfig(); 
  3.   // 0. Session 對象中是否緩存著一個已經進行身份驗證的 Principal 
  4.   if (cache) { 
  5.     Principal principal = request.getUserPrincipal(); 
  6.     if (principal == null) { 
  7.       Session session = request.getSessionInternal(false); 
  8.       if (session != null) { 
  9.         principal = session.getPrincipal(); 
  10.         if (principal != null) { 
  11.           request.setAuthType(session.getAuthType()); 
  12.           request.setUserPrincipal(principal); 
  13.         } 
  14.       } 
  15.     } 
  16.   } 
  17.   // 對于基于表單登錄,可能位于安全域之外的特殊情況進行處理 
  18.   String contextPath = this.context.getPath(); 
  19.   String requestURI = request.getDecodedRequestURI(); 
  20.   if (requestURI.startsWith(contextPath) && requestURI.endsWith(Constants.FORM_ACTION)) { 
  21.           return
  22.       } 
  23.   } 
  24.   // 獲取安全域對象,默認配置是 LockOutRealm 
  25.   Realm realm = this.context.getRealm(); 
  26.   // 根據請求 URI 嘗試獲取配置的安全約束 
  27.   SecurityConstraint [] constraints = realm.findSecurityConstraints(request, this.context); 
  28.   
  29.   if ((constraints == null) /* && (!Constants.FORM_METHOD.equals(config.getAuthMethod())) */ ) { 
  30.     // 為 null 表示訪問的資源沒有安全約束,直接訪問下一個閥門 
  31.     getNext().invoke(request, response); 
  32.     return
  33.   } 
  34.   // 確保受約束的資源不會被 Web 代理或瀏覽器緩存,因為緩存可能會造成安全漏洞 
  35.   if (disableProxyCaching &&  
  36.       !"POST".equalsIgnoreCase(request.getMethod())) { 
  37.       if (securePagesWithPragma) { 
  38.           response.setHeader("Pragma""No-cache"); 
  39.           response.setHeader("Cache-Control""no-cache"); 
  40.       } else { 
  41.           response.setHeader("Cache-Control""private"); 
  42.       } 
  43.       response.setHeader("Expires", DATE_ONE); 
  44.   } 
  45.   int i; 
  46.   // 1. 檢查用戶數據的傳輸安全約束 
  47.   if (!realm.hasUserDataPermission(request, response, constraints)) { 
  48.     // 驗證失敗 
  49.     // Authenticator已經設置了適當的HTTP狀態代碼,因此我們不必做任何特殊的事情 
  50.     return
  51.   } 
  52.   // 2. 檢查是否包含授權約束,也就是角色驗證 
  53.   boolean authRequired = true
  54.   for(i=0; i < constraints.length && authRequired; i++) { 
  55.     if(!constraints[i].getAuthConstraint()) { 
  56.       authRequired = false
  57.     } else if(!constraints[i].getAllRoles()) { 
  58.       String [] roles = constraints[i].findAuthRoles(); 
  59.       if(roles == null || roles.length == 0) { 
  60.         authRequired = false
  61.       } 
  62.     } 
  63.   } 
  64.   // 3. 驗證用戶名和密碼 
  65.   if(authRequired) { 
  66.     // authenticate 是一個抽象方法,由不同的驗證方法實現 
  67.     if (!authenticate(request, response, config)) { 
  68.       return
  69.     }  
  70.   } 
  71.   // 4. 驗證用戶是否包含授權的角色 
  72.   if (!realm.hasResourcePermission(request, response,constraints,this.context)) { 
  73.     return
  74.   } 
  75.   // 5. 已滿足任何和所有指定的約束 
  76.   getNext().invoke(request, response); 

另外,AuthenticatorBase 還有一個比較重要的 register() 方法,它會把認證后生成的 Principal 對象設置到當前 Session 中,如果配置了SingleSignOn 單點登錄的閥門,同時把用戶身份、權限信息關聯到 SSO 中。

4. 單點登錄

Tomcat 支持通過一次驗證就能訪問部署在同一個虛擬主機上的所有 Web 應用,可通過以下配置實現:

  1. <Host name="localhost" ...> 
  2.   ... 
  3.   <Valve className="org.apache.catalina.authenticator.SingleSignOn"/> 
  4.   ... 
  5. </Host> 

Tomcat 的單點登錄是利用 Cookie 實現的:

當任一 Web 應用身份驗證成功后,都會把用戶身份信息緩存到 SSO 中,并生成一個名為 JSESSIONIDSSO 的 Cookie

當用戶再次訪問這個主機時,會通過 Cookie 拿出存儲的用戶 token,獲取用戶 Principal 并關聯到 Request 對象中

在單機環境下,沒有問題,在集群環境下,Tomcat 支持 Session 的復制,那單點登錄相關的信息也會同步復制嗎?后續會繼續分析 Tomcat 集群的原理和實現。

5. 小結

本文介紹的是 Tomcat 內部實現的登錄認證和權限,而應用程序通常都是通過 Filter 或者自定義的攔截器(如 Spring 的 Interceptor)實現登錄,或者使用第三方安全框架,比如 Shiro,但是原理都差不多。

至此,除了集群的實現,Tomcat 的核心原理已經分析完畢,接下來將會模擬實現一個簡單的 Tomcat,歡迎關注。

責任編輯:武曉燕 來源: 頓悟源碼
相關推薦

2024-05-28 08:24:18

2025-07-28 00:00:55

2025-07-30 09:15:22

2024-01-26 14:35:03

鑒權K8sNode

2014-07-10 11:34:05

2021-09-02 07:00:32

鑒權Web 應用Cookie-sess

2018-01-10 14:22:05

2025-08-01 09:25:30

2024-10-14 11:56:50

2022-12-02 16:28:47

2025-10-09 00:00:15

2022-05-31 08:36:41

微服務網關鑒權

2024-10-10 12:21:56

JWTSession擴展性

2025-07-29 07:11:39

2023-04-17 08:56:29

微服務鑒權業務

2023-03-30 07:48:46

接口鑒權SpringBoot

2023-10-31 07:13:43

2021-10-26 11:42:51

系統

2024-01-08 18:48:21

2020-03-19 10:13:13

OkHttpWebSocket
點贊
收藏

51CTO技術棧公眾號

日本高清不卡在线观看| 91视频国产资源| 欧美成人精品在线视频| av影片在线播放| 中文字幕在线直播| 国产精品免费免费| 国产日韩在线一区二区三区| 波多野结衣黄色| 欧美激情性爽国产精品17p| 精品亚洲aⅴ在线观看| 91 视频免费观看| 天堂av在线网| 亚洲自拍偷拍综合| 看欧美日韩国产| 国产又大又黄又爽| 亚洲欧美久久久| 久久精品一本久久99精品| 亚洲少妇中文字幕| 色噜噜成人av在线| 色菇凉天天综合网| 国产xxxx振车| 日本天堂在线观看| 91亚洲男人天堂| 97netav| 中文字幕日本视频| 亚洲欧美日韩精品一区二区| 久久91亚洲人成电影网站| 人与嘼交av免费| 欧美黑白配在线| 日韩午夜中文字幕| 九九九九九国产| 韩国精品主播一区二区在线观看 | 精品一区精品二区高清| 欧美亚洲国产成人精品| 九九热精品免费视频| 久久人人99| 影音先锋欧美精品| 成都免费高清电影| 国内露脸中年夫妇交换精品| 91精品国产综合久久福利| 国产精品igao| 色综合一本到久久亚洲91| 精品福利一区二区| r级无码视频在线观看| 国产色在线观看| 综合激情成人伊人| 中文字幕久久一区| 日本天堂在线观看| 国产精品久久久久久久午夜片| 日韩wuma| p色视频免费在线观看| 国产日韩精品一区二区三区| 欧美成人dvd在线视频| 天堂av中文在线资源库| a级精品国产片在线观看| 俄罗斯精品一区二区三区| 精品国产区一区二| 国产.欧美.日韩| 国产成人精品自拍| 国 产 黄 色 大 片| 懂色av一区二区三区免费看| 亚洲最大福利视频| 亚洲精品无遮挡| 成人av一区二区三区| 久久国产欧美精品| 九色在线观看| 亚洲欧洲三级电影| 国产在线观看欧美| 激情视频网站在线播放色| 狠狠色香婷婷久久亚洲精品| 国产主播在线看| 99久久伊人| 欧美一级理论片| 视频免费在线观看| 教室别恋欧美无删减版| 精品国产欧美一区二区三区成人| 中文字幕在线观看成人| 在线观看不卡| 国产大片精品免费永久看nba| 中文字幕在线观看第二页| 精品一区二区在线观看| 国产美女精品久久久| 青青草在线播放| 中文字幕第一区综合| 成人高清dvd| av在线最新| 欧美一a一片一级一片| 超碰在线超碰在线| 日韩mv欧美mv国产网站| 色婷婷综合久久久久中文字幕1| 国产探花在线免费观看| 日韩亚洲国产精品| 国产精品一区久久久| 亚洲欧美激情国产综合久久久| 久久综合色8888| 免费国产成人看片在线| 色偷偷色偷偷色偷偷在线视频| 欧美性xxxxxx少妇| 欧美久久久久久久久久久| 国内精品久久久久久久影视简单 | 三级影片在线观看| 亚洲另类黄色| 91美女片黄在线观| 日韩精品视频在线观看一区二区三区| 国产精品久久久久久户外露出| 黄页免费在线观看视频| 日韩成人在线一区| 日韩av网址在线| 国产极品国产极品| 蜜臀久久99精品久久久画质超高清 | 久久久久久久精| 无码人妻精品一区二区三区99v| 手机av在线| 日韩欧美一区二区视频| 五月天精品视频| 狠狠爱综合网| 成人网址在线观看| 成人网视频在线观看| 亚洲不卡av一区二区三区| 在线播放免费视频| av永久不卡| 欧美亚洲国产成人精品| 风流老熟女一区二区三区| 国产精品久久久久久久久动漫 | 精品在线观看视频| 日韩激情视频| 伊人成综合网站| 亚洲成人在线网| 日韩激情综合网| 免费高清成人在线| 欧洲久久久久久| 天天综合av| 日韩大陆毛片av| 午夜影院在线看| 国v精品久久久网| 黄色一级大片免费| 久久九九精品视频| 久久影院资源网| 国产又大又黄又爽| 18成人在线视频| 小泽玛利亚视频在线观看| 国产一区二区欧美| 日本伊人精品一区二区三区介绍| 男人天堂av网| 五月天婷婷综合| 日本少妇xxxx| 亚洲美女91| 久久精品国产精品国产精品污 | 久久精品国产一区二区| 日韩免费毛片| 2019年精品视频自拍| 一级做a爰片久久毛片美女图片| 亚洲图片在线视频| 久久嫩草精品久久久精品| 精品视频一区二区在线| 国产免费播放一区二区| 国产精品久久国产精品99gif| 国产黄色在线| 欧美男女性生活在线直播观看| 亚洲欧洲综合网| 国模娜娜一区二区三区| 一级特黄妇女高潮| 97久久综合区小说区图片区| 欧美激情一区二区久久久| 欧美一级做性受免费大片免费| 亚洲高清免费视频| 欧美一区二区三区成人精品| 石原莉奈在线亚洲二区| 一区二区三区四区视频在线| 国产成人免费av一区二区午夜| 欧美高清无遮挡| 日本高清视频在线| 91黄色免费版| 国产一二三区精品| 99re这里都是精品| 成人亚洲精品777777大片| 97精品一区二区| 成人在线视频网址| 小黄鸭精品aⅴ导航网站入口| 中文字幕日韩av电影| 国产区精品在线| 欧美日韩国内自拍| 色婷婷国产精品免| 国产精品一二三四五| 日本免费不卡一区二区| 日韩精品午夜| 好吊色欧美一区二区三区视频| 国产日韩电影| 欧美老女人性视频| 四虎成人免费在线| 69av一区二区三区| 国产精品777777| 综合中文字幕亚洲| av网站有哪些| 国产一区二区在线观看视频| 国产精品宾馆在线精品酒店| 91久久电影| 久久福利电影| 亚洲精选av| 国产精品大片wwwwww| 密臀av在线| 中文字幕在线亚洲| 神马一区二区三区| 4438亚洲最大| 在线观看日本网站| 亚洲国产精品人人做人人爽| 中文字幕欧美激情极品| 99国产精品久久久久久久久久久| 欧美一级小视频| 日韩成人伦理电影在线观看| 欧美在线一区视频| 亚洲国产日韩欧美在线| 日本在线播放一区| 伦理一区二区三区| 97免费资源站| 91精品一久久香蕉国产线看观看| 青青a在线精品免费观看| 久久不射影院| 久久综合亚洲社区| 在线免费观看黄| 亚洲图片制服诱惑| 亚州av在线播放| 日韩欧美国产不卡| 国产乱色精品成人免费视频 | 99在线小视频| 欧美乱妇20p| 欧美人一级淫片a免费播放| 天天影视网天天综合色在线播放| 欧美日韩在线国产| √…a在线天堂一区| 日本综合在线观看| 国产亚洲婷婷免费| 国产 欧美 在线| 91碰在线视频| 91精品国产自产| 99精品国产视频| 黄色av网址在线观看| 成人午夜短视频| 日本精品一二三区| 国产jizzjizz一区二区| 黄色片子免费看| 国产一区 二区 三区一级| 国内自拍第二页| 狠狠色2019综合网| 性久久久久久久久久久久久久| 九九久久精品视频| www.午夜av| 国产成人精品免费| 午夜免费福利影院| 99riav一区二区三区| 黄色正能量网站| 欧美极品aⅴ影院| 四虎成人免费影院| 成人免费视频在线观看| 日韩va亚洲va欧美va清高| 亚洲欧美视频在线观看| 欧美老熟妇一区二区三区| 亚洲欧美另类久久久精品2019| 欧美成人精品欧美一| 亚洲一区在线视频| 日韩精品一区三区| 精品久久香蕉国产线看观看gif| 中文字幕一区二区三区精品 | 91 在线视频观看| 国产精品一区二区三区四区| 岛国精品一区二区三区| 91女神在线视频| 纪美影视在线观看电视版使用方法| 中文字幕一区二区三区精华液| 欧美黑人一级片| 五月天激情综合| 中文字幕久久久久| 日韩视频一区二区三区| 色欲久久久天天天综合网| 亚洲欧美综合v| 黄在线免费观看| 97精品国产97久久久久久春色 | 亚洲欧洲日本mm| 久久久久久香蕉| 国产一区二区三区在线看麻豆| 天天躁日日躁狠狠躁av麻豆男男| 久久久久亚洲综合| 丝袜美腿小色网| 婷婷成人综合网| 岳乳丰满一区二区三区| 欧美不卡一区二区| 国产区视频在线| 久久91精品国产91久久跳| 亚洲第一av| 91精品天堂| 精品国产一区二区三区av片| 欧洲精品视频在线| 天堂成人国产精品一区| 中文字幕欧美视频| 久久久精品免费免费| 九九热精彩视频| 欧美色手机在线观看| 免费看国产片在线观看| 日韩中文字幕在线观看| 欧美裸体视频| 91福利视频导航| 欧美日韩精品一区二区视频| 和岳每晚弄的高潮嗷嗷叫视频| 麻豆精品在线看| 精品人妻一区二区三区香蕉 | 国产成人艳妇aa视频在线| 三级影片在线观看欧美日韩一区二区 | 高清不卡在线观看| 我要看一级黄色录像| 欧美日韩国产页| 亚洲国产www| 久久精品免费播放| 亚洲成人一区在线观看| 精品久久中出| 欧美午夜精品| 亚洲色图欧美自拍| 欧美国产日韩精品免费观看| 日本一区二区三区四区五区| 91麻豆精品国产91久久久久久久久| 你懂的视频在线免费| 国产69精品久久久久9999| 国产一区二区三区亚洲综合| 亚洲成人av动漫| 久久这里只有| 国产中文字幕一区二区| 亚洲最大色网站| 国产福利第一视频| 久热国产精品视频| 国产精品igao视频网网址不卡日韩| 日韩欧美精品一区二区| 久久不射网站| 麻豆av免费观看| 色综合中文综合网| 日韩电影在线观看完整版| 97**国产露脸精品国产| 国产精品久久久网站| 真人抽搐一进一出视频| 岛国av在线一区| 国产在线视频第一页| 精品国产一区二区精华| 日本在线观看高清完整版| 2019国产精品视频| 午夜久久99| www.欧美com| 亚洲国产精品久久久男人的天堂| 性猛交xxxx乱大交孕妇印度| 欧美成人网在线| av综合网址| 国产九九九九九| 久久综合中文字幕| 青青草视频在线观看免费| 亚洲性夜色噜噜噜7777| 欧美高清你懂的| 青少年xxxxx性开放hg| 国产一区二区三区精品欧美日韩一区二区三区| 女同久久另类69精品国产| 6080日韩午夜伦伦午夜伦| 黄色网址视频在线观看| 99国产视频| 一区二区三区国产盗摄| 性欧美精品中出| 欧美日韩另类一区| 在线观看中文字幕的网站| 国产一区二区三区色淫影院| 国产精品人人爽人人做我的可爱| 亚洲人成人无码网www国产| 欧美日韩和欧美的一区二区| bestiality新另类大全| 国产精品一区在线播放| 三级欧美在线一区| 欧美爱爱免费视频| 精品国产一二三区| 日韩精品影院| 玖玖精品在线视频| 91在线观看地址| 96日本xxxxxⅹxxx17| 久久久久国产一区二区三区| 欧美男男gaytwinkfreevideos| 激情五月婷婷基地| 午夜影院久久久| 天天在线视频色| 好看的日韩精品| 狠狠色伊人亚洲综合成人| 国产稀缺真实呦乱在线| 在线视频一区二区| 一区二区三区视频免费视频观看网站 | av网站大全在线| 欧美日本亚洲| 国产a区久久久| 波多野结衣绝顶大高潮| 精品中文字幕乱| 欧美精品一二| 一级黄色免费视频| 欧美日韩在线一区二区| 丁香花在线电影| 一级做a爰片久久| 91丨porny丨在线| 国产sm主人调教女m视频| 国产成人精品一区二区| 亚洲午夜91|