溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Tomcat內部是如何處理來完成BASIC應用認證的

發布時間:2022-01-14 10:42:45 來源:億速云 閱讀:185 作者:iii 欄目:大數據

今天小編給大家分享一下Tomcat內部是如何處理來完成BASIC應用認證的的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1. Authorization 請求頭

在此之前,我們先來了解下請求頭中的Authorization的具體作用,以下為RFC2616中對于authorization的定義:

A user agent that wishes to authenticate itself with a server--

usually, but not necessarily, after receiving a 401 response--

does so by including an Authorization request-header field with the

request. T

Authorization = "Authorization" ":" credentials

即在收到服務器返回401信息之后,用于向服務器傳遞認證的信息。

2. BASIC認證

對于HTTP的安全認證方式,有以下幾種實現形式:

  • BASIC

  • FORM

  • DIGEST

  • SSL

在輸入用戶名和密碼之后,實際上傳到Tomcat的是這樣一個內容:


Basic dG9tY2F0OnRvbWNhdA==


這個字符串,空格前是當前認證使用的方式,空格后是用戶名和密碼的Base64編碼,寫到這里,大家應該會的一聲,后臺直接不就是Base64解碼嘛。你說的對。是這樣的


解碼的代碼如下:位于BasicAuthorization.authenticate()
// Validate any credentials already included with this request
MessageBytes authorization =
   request.getCoyoteRequest().getMimeHeaders()
   .getValue("authorization"); //解析出請求頭中的認證值

if (authorization != null) {
   authorization.toBytes();
   ByteChunk authorizationBC = authorization.getByteChunk();
   BasicCredentials credentials = null;
   try {
       credentials = new BasicCredentials(authorizationBC); //具體解析用戶名和密碼的地方
       String username = credentials.getUsername();
       String password = credentials.getPassword();

       //根據獲得的數據進Realm認證
       principal = context.getRealm().authenticate(username, password);
       if (principal != null) {
           register(request, response, principal,
               HttpServletRequest.BASIC_AUTH, username, password);
           return (true);
       }
   }
   catch (IllegalArgumentException iae) {
       if (log.isDebugEnabled()) {
           log.debug("Invalid Authorization" + iae.getMessage());
       }
   }
}
BasicCredentials構造函數:
/**
* Parse the HTTP Authorization header for BASIC authentication
* as per RFC 2617 section 2, and the Base64 encoded credentials
* as per RFC 2045 section 6.8.
*
* @param input The header value to parse in-place
*
* @throws IllegalArgumentException If the header does not conform
*                                  to RFC 2617
*/
public BasicCredentials(ByteChunk input)
       throws IllegalArgumentException {
   authorization = input;
   initialOffset = input.getOffset();
   parseMethod();
   byte[] decoded = parseBase64();
   parseCredentials(decoded);//這里提取
}

這就是Basic的Authorization請求頭提取過程。PostMan做的就是在請求前先把用戶名和密碼的信息添加到請求頭中。


如果你看完本文會打開代碼嘗試一下的話,Tomcat的Manager應用就是個樣例。其也是通過BASIC完成認證的。


3. 應用

我們一般的應用如何配置還使用BASIC認證呢?

需要做的就是在web.xml中聲明如下片段
  <login-config>
<auth-method>BASIC</auth-method>
   <realm-name>Tomcat Manager Application</realm-name>
 </login-config>

此時即為應用使用BASIC認證了。但如果這個時候你急忙去試的話,一定是不起作用的。因為你沒說明哪些資源要保護??!

還需要單獨聲明哪些資源保護,例如下面的配置片段
 <security-constraint>

<web-resource-collection>

<web-resource-name>HTML Manager</web-resource-name>

<url-pattern>/html/*</url-pattern>

</web-resource-collection>

<auth-constraint>

<role-name>manager-gui</role-name>

</auth-constraint>

</security-constraint>


上面聲明具體的受保護的請求路徑,對應使用的角色等。配置的更多內容可以參考Manager應用,我們不再多談。

4. 為什么


我們上面提到HTTP的認證方式有許多種,Tomcat也都有對應的實現。

那在web.xml中配置了BASIC之后,是怎么和具體BASIC認證的代碼對應起來的呢?

實際上實現原理是這個樣子的:

上面列表中所示的這些認證方式,對應到Tomcat中,是以一個Valve的形式實現。這個具體每個應用添加哪個對應認證方式的Valve,就是通過解析web.xml中配置的auth-method,判斷具體方式來實現的。

以上就是“Tomcat內部是如何處理來完成BASIC應用認證的”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女