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

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

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

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

  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 NameCallback) {
  NameCallback nc = (NameCallback) callbacks[i];
  nc.setName(username);
  } else if (callbacks[i] instanceof URLCallback) {
  URLCallback uc = (URLCallback) callbacks[i];
  uc.setURL(url);
  } else if (callbacks[i] instanceof PasswordCallback) {
  PasswordCallback pc = (Pa

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 栾城县| 衡南县| 本溪| 营山县| 唐河县| 体育| 通山县| 尤溪县| 鹿邑县| 红河县| 那曲县| 深州市| 卓尼县| 晋中市| 沂水县| 磐安县| 嘉定区| 深州市| 荆门市| 平湖市| 达日县| 芮城县| 金门县| 清涧县| 西城区| 弥渡县| 安泽县| 常州市| 定安县| 叶城县| 彩票| 台中县| 都兰县| 云浮市| 博兴县| 福建省| 平乡县| 佳木斯市| 长丰县| 浦北县| 墨脱县|