什麼是JAAS,以及靈活的Java安全機制

來源:互聯網
上載者:User

今天在論壇上看到JASS,不清楚是什麼呢,網上找了一下,受益良多

 

Java Authentication Authorization Service(JAAS,Java驗證和授權API)提供了靈活和可伸縮的機制來保證用戶端或伺服器端的Java程式。Java早期的安全架構強調的是通過驗證代碼的來源和作者,保護使用者避免受到下載下來的代碼的攻擊。JAAS強調的是通過驗證誰在運行代碼以及他/她的許可權來保護系統面受使用者的攻擊。它讓你能夠將一些標準的安全機制,例如Solaris NIS(網路資訊服務)、Windows NT、LDAP(輕量目錄存取協議),Kerberos等通過一種通用的,可配置的方式整合到系統中。

  你是否曾經需要為一個應用程式實現登入模組呢?如果你是一個比較有經驗的程式員,相信你這樣的工作做過很多次,而且每次都不完全一樣。你有可能把你的登入模組建立在Oracle資料庫的基礎上,也有可能使用的是NT的使用者驗證,或者使用的是LDAP目錄。如果有一種方法可以在不改變應用程式級的代碼的基礎上支援上面提到的所有這一些安全機制,對於程式員來說一定是一件幸運的事。

  現在你可以使用JAAS實現上面的目標。JAAS是一個比較新的的Java API。在J2SE 1.3中,它是一個擴充包;在J2SE 1.4中變成了一個核心包。在本文中,我們將介紹JAAS的一些核心概念,然後通過例子說明如何將JAAS應用到實際的程式中。本文的例子是根據我們一個基於Web的Java應用程式進行改編的,在這個例子中,我們使用了關聯式資料庫儲存使用者的登入資訊。由於使用了JAAS,我們實現了一個健壯而靈活的登入和身分識別驗證模組。

 

 

用戶端和伺服器端的JAAS
  開發人員可以將JAAS應用到用戶端和伺服器端。在用戶端使用JAAS很簡單
。在伺服器端使用JAAS時情況要複雜一些。目前在應用伺服器市場中的JAAS產
品還不是很一致,使用JAAS的J2EE應用伺服器有一些細微的差別。例如JBossSx
使用自己的結構,將JAAS整合到了一個更大的安全架構中;而雖然WebLogic 6
.x也使用了JAAS,安全架構卻完全不一樣。
  現在你能夠理解為什麼我們需要從用戶端和伺服器端的角度來看JAAS了。
我們將在後面列出兩種情況下的例子。為了使伺服器端的例子程式更加簡單,
我們使用了Resin應用伺服器。
  核心JAAS類
  在使用JAAS之前,你首先需要安裝JAAS。在J2SE 1.4中已經包括了JAAS,
但是在J2SE 1.3中沒有。如果你希望使用J2SE 1.3,你可以從SUN的官方網站上
下載JAAS。當正確安裝了JAAS後,你會在安裝目錄的lib目錄下找到jaas.jar。
你需要將該路徑加入Classpath中。(註:如果你安裝了應用伺服器,其中就已
經包括了JAAS,請閱讀應用伺服器的協助文檔以獲得更詳細的資訊)。在Java
安全屬性檔案java.security中,你可以改變一些與JAAS相關的系統屬性。該文

 

件儲存在<jre_home>/lib/security目錄中。
  在應用程式中使用JAAS驗證通常會涉及到以下幾個步驟:
  1. 建立一個LoginContext的執行個體。
  2. 為了能夠獲得和處理驗證資訊,將一個CallBackHandler對象作為參數
傳送給LoginContext。
  3. 通過調用LoginContext的login()方法來進行驗證。
  4. 通過使用login()方法返回的Subject對象實現一些特殊的功能(假設
登入成功)。
  下面是一個簡單的例子:
LoginContext lc = new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
// Authentication failed.
}
// Authentication successful, we can now continue.
// We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
  在運行這段代碼時,後台進行了以下的工作。
  1. 當初始化時,LoginContext對象首先在JAAS設定檔中找到MyExample
項,然後更具該項的內容決定該載入哪個LoginModule對象(參見圖二)。
  2. 在登入時,LoginContext對象調用每個LoginModule對象的login()方
法。
  3. 每個login()方法進行驗證操作或獲得一個CallbackHandle對象。

 

  4. CallbackHandle對象通過使用一個或多個CallBack方法同使用者進行互動
,獲得使用者輸入。
  5. 向一個新的Subject對象中填入驗證資訊。
  我們將對代碼作進一步的解釋。但是在這之前,讓我們先看代碼中涉及到
的核心JAAS類和介面。這些類可以被分為三種類型:
  普通類型 Subject,Principal,憑證
  驗證 LoginContext,LoginModule,CallBackHandler,Callback
  授權 Policy,AuthPermission,PrivateCredentialPermission
  上面列舉的類和介面大多數都在javax.security.auth包中。在J2SE 1.4中
,還有一些介面的實作類別在com.sun.security.auth包中。
  普通類型:Subject,Principal,憑證
  Subject類代表了一個驗證實體,它可以是使用者、管理員、Web服務,裝置
或者其他的過程。該類包含了三中類型的安全資訊:
   身份(Identities):由一個或多個Principal對象表示
   公用憑證(Public credentials):例如名稱或公用秘鑰
   私人憑證(Private credentials):例如口令或私人密鑰
  Principal對象代表了Subject對象的身份。它們實現了java.security.Principal
和java.io.Serializable介面。在Subject類中,最重要的方法是getName()
。該方法返回一個身份名稱。在Subject對象中包含了多個Principal對象,因
此它可以擁有多個名稱。由於登入名稱稱、社會安全號碼和Email地址都可以作為使用者
的身份標識,可見擁有多個身份名稱的情況在實際應用中是非常普遍的情況。
  在上面提到的憑證並不是一個特定的類或借口,它可以是任何對象。憑證
中可以包含任何特定安全系統需要的驗證資訊,例如標籤(ticket),密鑰或
口令。Subject對象中維護著一組特定的私人和公有的憑證,這些憑證可以通過
getPrivateCredentials()和getPublicCredentials()方法獲得。這些方法
通常在應用程式層中的安全子系統被調用。
  驗證:LoginContext
  在應用程式層中,你可以使用LoginContext對象來驗證Subject對象。LoginContext
對象同時體現了JAAS的動態可插入性(Dynamic Pluggability),因為當你創
建一個LoginContext的執行個體時,你需要指定一個配置。LoginContext通常從一
個文字檔中載入配置資訊,這些配置資訊告訴LoginContext對象在登入時使
用哪一個LoginModule對象。
  下面列出了在LoginContext中經常使用的三個方法:
  login () 進行登入操作。該方法啟用了配置中制定的所有LoginModule對

 

象。如果成功,它將建立一個經過了驗證的Subject對象;否則拋出LoginException
異常。
  getSubject () 返回經過驗證的Subject對象
  logout () 登出Subject對象,刪除與之相關的Principal對象和憑證
  驗證:LoginModule
  LoginModule是調用特定驗證機制的介面。J2EE 1.4中包含了下面幾種LoginModule
的實作類別:
  JndiLoginModule 用於驗證在JNDI中配置的目錄服務
  Krb5LoginModule 使用Kerberos協議進行驗證
  NTLoginModul 使用目前使用者在NT中的使用者資訊進行驗證
  UnixLoginModule 使用目前使用者在Unix中的使用者資訊進行驗證
  同上面這些模組綁定在一起的還有對應的Principal介面的實作類別,例如NTDomainPrincipal
和UnixPrincipal。這些類在com.sun.security.auth包中。
  LoginModule介面中包含了五個方法:
  initialize () 當建立一LoginModule執行個體時會被建構函式調用
  login () 進行驗證
  commit () 當LgoninContext對象接受所有LoginModule對象傳回的結果後
將調用該方法。該方法將Principal對象和憑證賦給Subject對象。
  
  abort () 當任何一個LoginModule對象驗證失敗時都會調用該方法。此時

沒有任何Principal對象或憑證關聯到Subject對象上。
  logout () 刪除與Subject對象關聯的Principal對象和憑證。
  在應用程式的代碼中,程式員通常不會直接調用上面列出的方法,而是通
過LigonContext間接調用這些方法。
  驗證:CallbackHandler和Callback
  CallbackHandler和Callback對象可以使LoginModule對象從系統和使用者那
裡收集必要的驗證資訊,同時獨立於實際的收集資訊時發生的互動過程。
  
  JAAS在javax.sevurity.auth.callback包中包含了七個Callback的實作類別
和兩個CallbackHandler的實作類別:ChoiceCallback、ConfirmationCallback、
LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、
TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback
介面只會在用戶端會被使用到。我將在後面介紹如何編寫你自己的CallbackHandler
類。

引用地址:http://hi.baidu.com/%D5%C5%B9%DA%C1%D6/blog/item/aba45743222f67159213c61b.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.