分享
 
 
 

安全技术Java与安全性,第2部分二

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有