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

安全技術 Java與安全性,第2部分二

2013-11-23 19:53:47  來源: Java高級技術 

  PrivilegedAction
  
  任何實現PrivilegedAction接口的類都封裝了一些代碼Java客戶端可以在由已填充的Subject定義的安全上下文中運行這些代碼在這種安全上下文下調用已授權動作之前weblogicsecuritySecurityrunAs( )方法允許客戶端把一個Subject與當前線程相關聯
  
  示例JAAS客戶端
  
  讓我們考察一下如何構建一個能夠為WebLogic對自身進行身份驗證的JAAS客戶端我們將使用從上至下的方法講述這個例子從JAAS客戶端需要實現的內容開始然後再細分為其實現的單個組件讓我們從主類SimpleJAASClient開始采取以下步驟
  
  它從命令行讀取用戶名密碼和URL作為輸入參數
  
  它嘗試連接到特定的URL然後使用所提供的用戶名和密碼對客戶端進行身份驗證
  
  它在新獲得的已驗證對象下執行一個已授權的動作列出了我們的JAAS客戶端的源代碼
  
  例列出了我們的JAAS客戶端的源代碼
  
  例示例JAAS客戶端
  
  package comoreillywlguidesecurityjaas;
  import javaxsecurityauthSubject;
  import javaxsecurityauthloginLoginContext;
  public class SimpleJAASClient {
  public static void main(String[] args) {
  String username = args[];
  String password = args[];
  String url = args[];
  LoginContext loginContext = null;
  // Create a LoginContext using our own CallBackHander
  try {
  loginContext = new LoginContext(Simple
  new SimpleCallbackHandler(username password url));
  } catch (Exception e) {
  // Can get a SecurityException or a LoginException
  eprintStackTrace( );
  Systemexit();
  }
  // Now authenticate If we dont get an exception we succeeded
  try {
  loginContextlogin( );
  } catch (Exception e) {
  // Can get FailedLoginException AccountExpiredException
  // or CredentialExpiredException
  eprintStackTrace( );
  Systemexit();
  }
  // Retrieve authenticated subject and perform action using it
  Subject subject = loginContextgetSubject( );
  SimpleAction simpleAction = new SimpleAction(url);
  weblogicsecuritySecurityrunAs(subject simpleAction);
  }
  }
  
  注意我們是如何突出JAAS客戶端的重點部分的我們的第一個關鍵步驟是建立LoginContext對象
  
  loginContext = new LoginContext(Simplenew SimpleCallbackHandler(username password url));
  
  LoginContext對象使用將在JAAS身份驗證期間使用的CallBackHandler和LoginModule實例初始化了客戶端構造器帶的第二個參數是我們自己的CallBackHandler實例LoginModule將使用它來獲得用戶證書以及將對我們的客戶端進行身份驗證的WebLogic實例的URL
  
  構造器帶的第一個參數是Simple用於為客戶端查找適當的LoginModuleJAAS客戶端依賴於一個配置文件該配置文件把JAAS登錄模塊的名稱映射為它們的實現而且還指定了另外的參數列出了我們使用的JAAS配置文件
  
  例 登錄配置文件nfig
  
  Simple {
  weblogicsecurityauthloginUsernamePasswordLoginModule
  required
  };
  
  我們的配置文件包含一個Simple入口在給定用戶名和密碼的基礎上為身份驗證指定了WebLogic的LoginModule weblogicsecurityauthloginUsernamePasswordLoginModule當運行JAAS客戶端時必須使用一個系統屬性指定該配置文件的位置下面說明了如何運行我們的示例JAAS客戶端
  
  java Djavasecnfig=nfig comoreillywlguidesecurityjaasSimpleJAASClient system pssst t://:
  /
  
  這樣我們就可以配置LoginContext以使用WebLogic的 LoginModule它支持使用用戶名-密碼組合的身份驗證稍後我們將看一看如何使用JAAS配置文件透明地使用LoginModule實現來代替這種方法
  
  建立登錄上下文之後我們調用了loginContextlogin( )方法來執行實際的登錄我們的LoginContext將利用已配置的登錄模塊和回調處理對象並嘗試借助服務器對客戶端進行身份驗證如果客戶端成功通過身份驗證可以從LoginContext獲得已驗證的主題
  
  Subject subject = loginContextgetSubject( );
  
  這個已驗證Subject上的getPrincipals( )方法將獲得與用戶相關的所有主體例如如果我們的JAAS客戶端使用系統管理員的證書進行身份驗證已驗證的Subject將具有兩個主體代表用戶的system和代表用戶的組的Administrators現在我們可以使用這個主題來執行一個或多個已授權的操作換句話說這些操作是在這個已驗證主題的上下文中執行的
  
  weblogicsecuritySecurityrunAs(subject simpleAction);
  
  這裡給出一個忠告——客戶端必須調用WebLogic的Security類上的runAs( )方法runAs( )方法帶有兩個參數已驗證的Subject和一個PrivilegedAction對象後者包裝了應用程序與服務器的特定交互說明了我們的JAAS客戶端希望執行的操作
  
  例 一個非常簡單的操作
  
  package comoreillywlguidesecurityjaas;
  import javasecurityPrivilegedAction;
  import javasqlConnection;
  import javautilHashtable;
  import javaxnamingContext;
  import javaxnamingInitialContext;
  import javaxsqlDataSource;
  public class SimpleAction implements PrivilegedAction {
  private static final String JNDI_NAME = jdbcxpetstore;
  private String url;
  public SimpleAction(String url) {
  thisurl = url;
  }
  public Object run( ) {
  Object obj = null;
  try {
  Context ctx = null;
  Hashtable ht = new Hashtable( );
  htput(ContextINITIAL_CONTEXT_FACTORY
  weblogicjndiWLInitialContextFactory);
  htput(ContextPROVIDER_URL url);
  // Get a context for the JNDI lookup
  ctx = new InitialContext(ht);
  // do any work here
  DataSource ds =(javaxsqlDataSource) ctxlookup(JNDI_NAME);
  //
  } catch (Exception e) {
  eprintStackTrace( );
  }
  return obj;
  }
  }
  
  在這裡需要考慮以下重點
  
  類實現 javasecurityPrivilegedAction接口然後任何JAAS 客戶端都可以在已驗證Subject的上下文中調用這個類的一個實例
  
  run( )方法封裝了客戶端與服務器的交互通常客戶端將建立一個JNDI上下文使用它來獲取綁定到JNDI樹的資源然後調用/訪問這些資源在前面的例子中我們使用了JNDI上下文來獲得JDBC數據源
  
  當我們在PrivilegedActionrun( )方法中建立JNDI上下文時我們沒有為JNDI身份驗證提供任何用戶證書JAAS客戶端提供已驗證的Subject給runAs( )方法確保PrivilegedAction對象是在這個主題的上下文中調用的也就是說runAs( )方法負責把已驗證的主題與當前線程關聯起來
  
  例列出了我們的CallBackHandler類的源代碼通常回調處理程序將與客戶端交互提示用戶輸入用於身份驗證的用戶名和密碼在我們的簡單JAAS客戶端的例子中我們提供了必需的證書和URL給我們的回調處理程序的構造器這樣回調便可容易地返回這些信息
  
  例 一個簡單的回調處理器
  
  package comoreillywlguidesecurityjaas;
  
  import javaxsecurityauthcallbackCallback;
  import javaxsecurityauthcallbackCallbackHandler;
  import javaxsecurityauthcallbackNameCallback;
  import javaxsecurityauthcallbackPasswordCallback;
  import javaxsecurityauthcallbackUnsupportedCallbackException;
  import weblogicsecurityauthcallbackURLCallback;
  
  public class SimpleCallbackHandler implements CallbackHandler {
  private String username = null;
  private String password = null;
  private String url = null;
  
  public SimpleCallbackHandler(String pUsername String pPassword String pUrl) {
  username = pUsername; password = pPassword; url = pUrl;
  }
  
  public void handle(Callback[] callbacks)
  throws javaioIOException UnsupportedCallbackException {
  for (int i = ; i < callbackslength; i++) {
  if (callbacks[i] instanceof NameCallback) {
  NameCallback nc = (NameCallback) callbacks[i];
  ncsetName(username);
  } else if (callbacks[i] instanceof URLCallback) {
  URLCallback uc = (URLCallback) callbacks[i];
  ucsetURL(url);
  } else if (callbacks[i] instanceof PasswordCallback) {
  PasswordCallback pc = (Pa
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27631.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.