熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

JAAS:靈活的Java安全機制

2013-11-23 19:49:56  來源: Java高級技術 

  摘要
  
  Java Authentication Authorization Service(JAASJava驗證和授權API)提供了靈活和可伸縮的機制來保證客戶端或服務器端的Java程序Java早期的安全框架強調的是通過驗證代碼的來源和作者保護用戶避免受到下載下來的代碼的攻擊JAAS強調的是通過驗證誰在運行代碼以及他/她的權限來保護系統面受用戶的攻擊它讓你能夠將一些標准的安全機制例如Solaris NIS(網絡信息服務)Windows NTLDAP(輕量目錄存取協議)Kerberos等通過一種通用的可配置的方式集成到系統中本文首先向你介紹JAAS驗證中的一些核心部分然後通過例子向你展示如何開發登錄模塊
  
  你是否曾經需要為一個應用程序實現登錄模塊呢?如果你是一個比較有經驗的程序員相信你這樣的工作做過很多次而且每次都不完全一樣你有可能把你的登錄模塊建立在Oracle數據庫的基礎上也有可能使用的是NT的用戶驗證或者使用的是LDAP目錄如果有一種方法可以在不改變應用程序級的代碼的基礎上支持上面提到的所有這一些安全機制對於程序員來說一定是一件幸運的事
  
  現在你可以使用JAAS實現上面的目標JAAS是一個比較新的的Java API在JSE 它是一個擴展包在JSE 中變成了一個核心包在本文中我們將介紹JAAS的一些核心概念然後通過例子說明如何將JAAS應用到實際的程序中本文的例子是根據我們一個基於Web的Java應用程序進行改編的在這個例子中我們使用了關系數據庫保存用戶的登錄信息由於使用了JAAS我們實現了一個健壯而靈活的登錄和身份驗證模塊
  
  Java驗證和授權概論
  
  在JAAS出現以前Java的安全模型是為了滿足跨平台的網絡應用程序的需要而設計的在Java早期版本中Java通常是作為遠程代碼被使用例如Applet因此最初的安全模型把注意力放在通過驗證代碼的來源來保護用戶上早期的Java安全機制中包含的概念如SercurityManager沙箱概念代碼簽名策略文件多是為了保護用戶
  
  JAAS的出現反映了Java的演變傳統的服務器/客戶端程序需要實現登錄和存取控制JAAS通過對運行程序的用戶的進行驗證從而達到保護系統的目的雖然JAAS同時具有驗證和授權的能力在這篇文章中我們主要介紹驗證功能
  
  通過在應用程序和底層的驗證和授權機制之間加入一個抽象層JAAS可以簡化涉及到Java Security包的程序開發抽象層獨立於平台的特性使開發人員可以使用各種不同的安全機制而且不用修改應用程序級的代碼和其他Java Security API相似JAAS通過一個可擴展的框架服務提供者接口(Service Provider InterfaceSPI)來保證程序獨立於安全機制服務提供者接口是由一組抽象類和接口組成的圖一中給出了JAAS程序的整體框架圖應用程序級的代碼主要處理LoginContext在LoginContext下面是一組動態配置的LoginModulesLoginModule使用正確的安全機制進行驗證
  
  圖一給出了JAAS的概覽應用程序層的代碼只需要和LoginContext打交道在LoginContext之下是一組動態配置的LoginModule對象這些對象使用相關的安全基礎結構進行驗證操作
   
  圖一 JAAS概覽 
  
  JAAS提供了一些LoginModule的參考實現代碼比如JndiLoginModule開發人員也可以自己實現LoginModule接口就象在我們例子中的RdbmsLonginModule同時我們還會告訴你如何使用一個簡單的配置文件來安裝應用程序
  
  為了滿足可插接性JAAS是可堆疊的在單一登錄的情況下一組安全模塊可以堆疊在一起然後被其他的安全機制按照堆疊的順序被調用
  
  JAAS的實現者根據現在一些流行的安全結構模式和框架將JASS模型化例如可堆疊的特性同Unix下的可堆疊驗證模塊(PAMPluggable Authentication Module)框架就非常相似從事務的角度看JAAS類似於雙步提交(TwoPhase CommitPC)協議的行為JAAS中安全配置的概念(包括策略文件(Police File)和許可(Permission))來自於JSE JAAS還從其他成熟的安全框架中借鑒了許多思想
  客戶端和服務器端的JAAS
  
  開發人員可以將JAAS應用到客戶端和服務器端在客戶端使用JAAS很簡單在服務器端使用JAAS時情況要復雜一些目前在應用服務器市場中的JAAS產品還不是很一致使用JAAS的JEE應用服務器有一些細微的差別例如JBossSx使用自己的結構將JAAS集成到了一個更大的安全框架中而雖然WebLogic x也使用了JAAS安全框架卻完全不一樣
  
  現在你能夠理解為什麼我們需要從客戶端和服務器端的角度來看JAAS了我們將在後面列出兩種情況下的例子為了使服務器端的例子程序更加簡單我們使用了Resin應用服務器
  
  核心JAAS類
  
  在使用JAAS之前你首先需要安裝JAAS在JSE 中已經包括了JAAS但是在JSE 中沒有如果你希望使用JSE 你可以從SUN的官方站點上下載JAAS當正確安裝了JAAS後你會在安裝目錄的lib目錄下找到jaasjar你需要將該路徑加入Classpath中(注如果你安裝了應用服務器其中就已經包括了JAAS請閱讀應用服務器的幫助文檔以獲得更詳細的信息)在Java安全屬性文件javasecurity中你可以改變一些與JAAS相關的系統屬性該文件保存在<jre_home>/lib/security目錄中
  
  在應用程序中使用JAAS驗證通常會涉及到以下幾個步驟
  
   創建一個LoginContext的實例
  
   為了能夠獲得和處理驗證信息將一個CallBackHandler對象作為參數傳送給LoginContext
  
   通過調用LoginContext的login()方法來進行驗證
  
   通過使用login()方法返回的Subject對象實現一些特殊的功能(假設登錄成功)
  
  下面是一個簡單的例子
  
  LoginContext lc = new LoginContext(MyExample);
  try {
  lclogin();
  } catch (LoginException) {
  // Authentication failed
  }
  
  // Authentication successful we can now continue
  // We can use the returned Subject if we like
  Subject sub = lcgetSubject();
  SubjectdoAs(sub new MyPrivilegedAction());
  
  在運行這段代碼時後台進行了以下的工作
  
   當初始化時LoginContext對象首先在JAAS配置文件中找到MyExample項然後更具該項的內容決定該加載哪個LoginModule對象(參見圖二)
  
   在登錄時LoginContext對象調用每個LoginModule對象的login()方法
  
   每個login()方法進行驗證操作或獲得一個CallbackHandle對象
  
   CallbackHandle對象通過使用一個或多個CallBack方法同用戶進行交互獲得用戶輸入
  
   向一個新的Subject對象中填入驗證信息
  
  我們將對代碼作進一步的解釋但是在這之前讓我們先看代碼中涉及到的核心JAAS類和接口這些類可以被分為三種類型
  
  普通類型 SubjectPrincipal憑證
  
  驗證 LoginContextLoginModuleCallBackHandlerCallback
  
  授權 PolicyAuthPermissionPrivateCredentialPermission
  
  上面列舉的類和接口大多數都在javaxsecurityauth包中在JSE 還有一些接口的實現類在comsunsecurityauth包中
  
  普通類型SubjectPrincipal憑證
  
  Subject類代表了一個驗證實體它可以是用戶管理員Web服務設備或者其他的過程該類包含了三中類型的安全信息
  
   身份(Identities)由一個或多個Principal對象表示
  
   公共憑證(Public credentials)例如名稱或公共秘鑰
  
   私有憑證(Private credentials)例如口令或私有密鑰
  
  Principal對象代表了Subject對象的身份它們實現了javasecurityPrincipal和javaioSerializable接口在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異
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27525.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.