国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

安全技術 Java與安全性,第2部分一(圖)

2019-11-18 12:22:40
字體:
來源:轉載
供稿:網友

  PRivilegedAction
  
  任何實現PrivilegedAction接口的類都封裝了一些代碼,java客戶端可以在由已填充的Subject定義的安全上下文中運行這些代碼。在這種安全上下文下調用已授權動作之前,weblogic.security.Security.runAs( )方法答應客戶端把一個Subject與當前線程相關聯。
  
  示例JAAS客戶端
  
  讓我們考察一下如何構建一個能夠為WebLogic對自身進行身份驗證的JAAS客戶端。我們將使用從上至下的方法講述這個例子,從JAAS客戶端需要實現的內容開始,然后再細分為其實現的單個組件。讓我們從主類SimpleJAASClient開始,采取以下步驟:
  
  它從命令行讀取用戶名、密碼和URL作為輸入參數。
  它嘗試連接到特定的URL,然后使用所提供的用戶名和密碼對客戶端進行身份驗證。
  它在新獲得的已驗證對象下執行一個已授權的動作。例17-1列出了我們的JAAS客戶端的源代碼。
  例17-1列出了我們的JAAS客戶端的源代碼。
  
  例17-1.示例JAAS客戶端
  
  package com.oreilly.wlguide.security.jaas;
  import javax.security.auth.Subject;
  import javax.security.auth.login.LoginContext;
  public class SimpleJAASClient {
  public static void main(String[] args) {
   String username = args[0];
   String passWord = args[1];
   String url = args[2];
   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
     e.printStackTrace( );
     System.exit(-1);
   }
   // Now authenticate. If we don't get an exception, we sUCceeded
   try {
     loginContext.login( );
   } catch (Exception e) {
     // Can get FailedLoginException, AccountEXPiredException,
     // or CredentialExpiredException
     e.printStackTrace( );
     System.exit(-1);
   }
   // Retrieve authenticated subject and perform action using it
   Subject subject = loginContext.getSubject( );
   SimpleAction simpleAction = new SimpleAction(url);
   weblogic.security.Security.runAs(subject, simpleAction);
  }
  }
  注重我們是如何突出JAAS客戶端的重點部分的。我們的第一個要害步驟是建立LoginContext對象:
  
  loginContext = new LoginContext("Simple",new SimpleCallbackHandler(username, password, url));
  LoginContext對象使用將在JAAS身份驗證期間使用的CallBackHandler和LoginModule實例初始化了客戶端。構造器帶的第二個參數是我們自己的CallBackHandler實例,LoginModule將使用它來獲得用戶證書,以及將對我們的客戶端進行身份驗證的WebLogic實例的URL。
  
  構造器帶的第一個參數是Simple,用于為客戶端查找適當的LoginModule。JAAS客戶端依靠于一個配置文件,該配置文件把JAAS登錄模塊的名稱映射為它們的實現,而且還指定了另外的參數。例17-2列出了我們使用的JAAS配置文件。
  
  例17-2. 登錄配置文件jaas.config
  Simple {
  weblogic.security.auth.login.UsernamePasswordLoginModule
  required
  };
  我們的配置文件包含一個Simple入口,在給定用戶名和密碼的基礎上為身份驗證指定了WebLogic的LoginModule: weblogic.security.auth.login.UsernamePasswordLoginModule.當運行JAAS客戶端時,必須使用一個系統屬性指定該配置文件的位置。下面說明了如何運行我們的示例JAAS客戶端:
  
  java -Djava.security.auth.login.config=jaas.config   com.oreilly.wlguide.security.jaas.SimpleJAASClient system pssst t3://10.0.10.10:
  8001/
  
  這樣,我們就可以配置LoginContext以使用WebLogic的 LoginModule,它支持使用用戶名-密碼組合的身份驗證。稍后,我們將看一看如何使用JAAS配置文件透明地使用LoginModule實現來代替這種方法。
  
  建立登錄上下文之后,我們調用了loginContext.login( )方法來執行實際的登錄。我們的LoginContext將利用已配置的登錄模塊和回調處理對象,并嘗試借助服務器對客戶端進行身份驗證。假如客戶端成功通過身份驗證,可以從LoginContext獲得已驗證的主題:
  
  Subject subject = loginContext.getSubject( );
  這個已驗證Subject上的getPrincipals( )方法將獲得與用戶相關的所有主體。例如,假如我們的JAAS客戶端使用系統治理員的證書進行身份驗證,已驗證的Subject將具有兩個主體:代表用戶的system,和代表用戶的組的Administrators。現在,我們可以使用這個主題來執行一個或多個“已授權”的操作。換句話說,這些操作是在這個已驗證主題的上下文中執行的:
  
  weblogic.security.Security.runAs(subject, simpleAction);
  這里給出一個忠告——客戶端必須調用WebLogic的Security類上的runAs( )方法。runAs( )方法帶有兩個參數:已驗證的Subject和一個PrivilegedAction對象,后者包裝了應用程序與服務器的特定交互。例17-3說明了我們的JAAS客戶端希望執行的操作。
  
  例17-3. 一個非常簡單的操作
  package com.oreilly.wlguide.security.jaas;
  import java.security.PrivilegedAction;
  import java.sql.Connection;
  import java.util.Hashtable;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.sql.DataSource;
  public class SimpleAction implements PrivilegedAction {
  private static final String JNDI_NAME = "jdbc.xpetstore";
  private String url;
  public SimpleAction(String url) {
   this.url = url;
  }
  public Object run( ) {
   Object obj = null;
   try {
     Context ctx = null;
     Hashtable ht = new Hashtable( );
     ht.put(Context.INITIAL_CONTEXT_FACTORY,
     "weblogic.jndi.WLInitialContextFactory");
     ht.put(Context.PROVIDER_URL, url);
     // Get a context for the JNDI lookup
     ctx = new InitialContext(ht);
     // do any work here
     DataSource ds =(javax.sql.DataSource) ctx.lookup(JNDI_NAME);
     // ...
   } catch (Exception e) {
     e.printStackTrace( );
   }
   return obj;
  }
  }
  在這里,需要考慮以下重點:
  
  類實現 java.security.PrivilegedAction接口。然后,任何JAAS 客戶端都可以在已驗證Subject的上下文中調用這個類的一個實例。
  run( )方法封裝了客戶端與服務器的交互。通常,客戶端將建立一個JNDI上下文,使用它來獲取綁定到JNDI樹的資源,然后調用/訪問這些資源。在前面的例子中,我們使用了JNDI上下文來獲得JDBC數據源。
  當我們在PrivilegedAction.run( )方法中建立JNDI上下文時,我們沒有為JNDI身份驗證提供任何用戶證書。JAAS客戶端提供已驗證的Subject給runAs( )方法,確保PrivilegedAction對象是在這個主題的上下文中調用的。也就是說,runAs( )方法負責把已驗證的主題與當前線程關聯起來。
  例17-4列出了我們的CallBackHandler類的源代碼。通常,回調處理程序將與客戶端交互,提示用戶輸入用于身份驗證的用戶名和密碼。在我們的簡單JAAS客戶端的例子中,我們提供了必需的證書和URL給我們的回調處理程序的構造器,這樣回調便可輕易地返回這些信息。
  
  例17-4. 一個簡單的回調處理器
  package com.oreilly.wlguide.security.jaas;
  
  import javax.security.auth.callback.Callback;
  import javax.security.auth.callback.CallbackHandler;
  import javax.security.auth.callback.NameCallback;
  import javax.security.auth.callback.PasswordCallback;
  import javax.security.auth.callback.UnsupportedCallbackException;
  import weblogic.security.auth.callback.URLCallback;
  
  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 java.io.IOException, UnsupportedCallbackException {
   for (int i = 0; i < callbacks.length; i++) {
     if (callbacks[i] instanceof NameCa

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泸水县| 韶关市| 奉新县| 弥勒县| 田东县| 洛扎县| 华安县| 普洱| 武平县| 张家界市| 汨罗市| 神木县| 公安县| 鹤壁市| 苏州市| 开原市| 岫岩| 施秉县| 金山区| 海晏县| 神农架林区| 蒙阴县| 酒泉市| 九江县| 海南省| 离岛区| 抚远县| 浠水县| 全南县| 瑞昌市| 通化县| 灵武市| 武宣县| 柳河县| 澎湖县| 濮阳市| 梁河县| 黄浦区| 邻水| 久治县| 阿尔山市|