- 浏览: 276324 次
- 性别:
- 来自: 北京
最新评论
-
gotosuzhou:
好的 谢谢分享
Spring 事务异常回滚 -
cd249745647:
哈哈
Spring MVC REST 例子 -
向日葵上的小蜜蜂:
代码都差不多贴出来了,为啥不直接提供下载呢
Spring MVC REST 例子 -
he3109006290:
我猜它应该有个算法,当出现长时间处理的情况的,它自动会启动另外 ...
netty 疑惑 -
yanghoho6:
很好, 学习了,
oracle基本的索引概念.doc
原文地址:http://www.ibm.com/developerworks/cn/views/java/tutorials.jsp?cv_doc_id=84887 关于作者 Brad Rubin 是 Brad Rubin & Associates Inc. 的负责人,该公司是一家专门从事无线网络与 Java 应用程序安全性和教育的计算机安全性咨询公司。Brad 在 IBM(位于明尼苏达州的 Rochester)工作了 14 年,从 AS/400 的第一个发行版开始, 就从事它的硬件和软件所有方面的开发。他是促使 IBM 转向支持 Java 平台的关键人物,并且是 IBM 最大的 Java 应用程序(称为 SanFrancisco (现在是 WebSphere 的一部分) 的商业应用程序框架产品)的首席架构设计师。他还是 Imation Corp. 数据存储部门(Data Storage Division)的首席技术官, 还是其研发组织的领导。 Brad 拥有计算机和电子工程学位,以及威斯康星大学麦迪逊分校计算机科学博士头衔。 他目前在明尼苏达大学教授电子和计算机工程高级设计(Senior Design)课程,并将于 2002 年秋季开发和教授该大学的计算机安全性(Computer Security)课程。可以通过 BradRubin@BradRubin.com 与 Brad 联系。 工具、代码样本和安装需求 JAAS 本来是 Java 2 平台标准版的扩展。然而,最近已将它添加到版本 1.4 中。要完成本教程,需要下列各项: 可以使用 JDK 1.3.x,但您必须自行安装 JCE 和 JSSE。 认证与授权 认证是用户或计算设备用来验证身份的过程。授权是根据请求用户的身份允许访问和操作一段敏感软件的过程。 这两个概念密不可分。没有授权, 就无需知道用户的身份。没能认证,就不可能区分可信和不可信用户, 更不可能安全地授权访问许多系统部分。 不一定要标识或认证个别实体;在某些情况下,可以通过分组,对给定组中的所有实体授予某种权限来进行认证。 在某些情况下,个别认证是系统安全性必不可少的环节。 认证与授权的另一个有趣方面是,一个实体在系统中可以有几个角色。 例如,用户可以同时是公司职工(表示他需要对公司的电子邮件有访问权)和该公司的会计师(表示他需要对公司财务系统有访问权)。 认证元素 认证基于以下一个或多个元素: 通常,对于授权只使用一种类别是不够的。例如,ATM 卡通常与 PIN 结合在一起使用。 即使物理卡丢失,用户和系统也能够安然无恙,因为小偷还必须知道 PIN 才能访问任何资源。 授权元素 有两种控制访问敏感代码的基本方法: 您将在本教程中学习声明性和程序性授权技术。 保护用户和代码 根据用户在代码中的可信度,Java 平台允许对计算资源(如磁盘文件和网络连接)进行细颗粒度的访问控制。Java 平台的大多数基本安全性特性都是为保护用户免受潜在的恶意代码破坏而设计的。例如, 第三方证书支持的数字签名代码确保代码来源的身份。 根据用户对代码来源的了解,他可以选择授予或拒绝对该代码的执行权。同样,用户可以根据给定代码来源的下载 URL 授予或拒绝访问权。 基于 Java 的系统上的访问控制是通过策略文件实现的,该文件包含的语句如下: 该语句允许由“Brad”签署并从 http://www.bradrubin.com 装入的代码读取 /tmp/abc 目录。 其它 Java 平台特性(如缺少指针)进一步保护用户免受潜在的恶意代码破坏。JAAS 的认证和授权服务一起工作,提供了补充功能:它们防止敏感的 Java 应用程序代码遭到潜在的恶意用户破坏。 可插入认证模块 JAAS 实现“可插入认证模块(Pluggable Authentication Module(PAM))”框架的 Java 版本。Sun Microsystems 为其 Solaris 操作系统创建了 PAM;通过 JAAS,现在可以以独立于平台的形式使用 PAM。 PAM 的主要用途是允许应用程序开发人员在开发时写入标准认证接口, 并将使用哪些认证技术(以及如何使用它们)的决策留给系统管理员。 认证技术是在登录模块中实现的, 这些登录模块是在编写了应用程序之后部署的,并且在称为登录配置文件(本教程中名为 login.config)的文本文件中指定。login.config 文件不仅可以指定要调用哪些模块,而且还可以指定总体认证成功的条件。 PAM 使新的认证技术或技巧能更方便地添加到现有应用程序中。 同样,可以通过更新 login.config 文件来更改认证策略,而不是重写整个应用程序。 JDK 1.4 是与下列 PAM 模块一起提供的。稍后,我们将在本教程中使用其中一个模块,并还要练习编写我们自己的两个模块: JAAS 示例和图 在本教程中,我们将逐一研究 JAAS 示例应用程序的代码。为了对总体情况有所了解, 下图显示了所有这些代码是如何组合在一起的。正在运行的示例(主程序 JAASExample)先使用两种技术(即两个登录模块)来认证用户,然后根据认证步骤的结果允许或禁止(或授权)访问两段敏感代码。 下面是 JAASExample 程序的图。下一页将描述操作流。 JAASExample 操作流 下面是由 JAASExample 图说明的总体认证与授权流的简要描述。以下每个步骤将在本教程的其它地方进行更为详细的描述。 我们从认证的第一步开始,就是要创建登录环境并试图登录。 初始化之后,选择的登录模块经历由 一旦认证完成,通过使用程序认证技术和 接下来,我们尝试使用声明性授权技术和 Subject 和 Principal 除了包含一组 Subject 的方法 Principal 接口 在登录过程期间, PrincipalImpl 这里是我们将在本教程中使用的 登录配置 JAAS 允许在以下几个方面有极大的灵活性: JAAS 使用 login.config 文件来指定每个登录模块的认证项。 login.config 文件包含 示例 login.config 文件 我们将在本教程中使用的 login.config 文件如下: 正如您看到的那样, 登录环境 回调处理程序 JAAS 登录使用回调处理程序来获取用户的认证信息。 在某些应用程序中,因为 JAAS 将用于与操作系统的认证机制相互操作,所以不需要任何用户交互。 在这种情况下, 回调处理程序代码 下面是本教程中使用的 登录模块 下面两页说明了两个登录模块。第一个是 AlwaysLoginModule PasswordLoginModule
grant signedBy "Brad", codeBase "http://www.bradrubin.com" {
permission java.io.FilePermission "/tmp/abc", "read";
};
com.sun.security.auth.module.NTLoginModule
com.sun.security.auth.module.NTSystem
com.sun.security.auth.module.JndiLoginModule
com.sun.security.auth.module.KeyStoreLoginModule
com.sun.security.auth.module.Krb5LoginModule
com.sun.security.auth.module.SolarisSystem
com.sun.security.auth.module.UnixLoginModule
com.sun.security.auth.module.UnixSystem
LoginContext
是一个 Java 类,它使用 login.config 文件中的信息来决定要调用哪些登录模块以及将使用什么标准来确定是否成功。 对本示例,有两个登录模块。 第一个登录模块是 AlwaysLoginModule
,它不需要密码,所以它总是成功的(这是不切实际的,但它足以说明 JAAS 是如何工作的)。 该模块用关键字 required
标记,表示它是成功所必需的(它总是成功)。第二个登录模块是PasswordLoginModule
,它需要密码,但该模块的成功与否是可选的,因为它用关键字 optional
标记。这表示即使 PasswordLoginModule
失败,但总体登录仍可成功。LoginContext
控制的两阶段提交过程。 作为该过程的一部分,调用UsernamePasswordCallbackHandler
以获取个人(用 Subject
对象表示)的用户名和密码。如果认证成功,则 Principal
被添加到 Subject
中。Subject
可以有许多 Principal
(在该示例中,是“Brad”和“joeuser”),每个 Principal
都授予用户对系统的不同级别的访问权。这样就完成了认证步骤。doAs
方法,用 Subject
来尝试执行一些敏感的工资单操作代码。JAAS 检查是否授予 Subject
访问权。 如果 Subject
有一个授权访问工资单代码的 Principal
, 那么允许继续执行。否则,将拒绝执行。doAsPrivilaged
方法来执行一些敏感的职员信息操作代码。这次,JAAS 部署用户定义的特权(PersonnelPermission
)、Java 策略文件(jaas.policy)和 Java 访问控制器(AccessController
)用来决定是否可以继续执行。Subject
是一种 Java 对象,它表示单个实体,如个人。 一个 Subject
可以有许多个相关身份,每个身份都由一个 Principal
对象表示。那么,比方说一个 Subject
表示要求访问电子邮件系统和财务系统的雇员。 该 Subject
将有两个 Principal
, 一个与用于电子邮件访问的雇员的用户标识关联, 另一个与用于财务系统访问的用户标识关联。Principal
不是持久性的,所以每次用户登录时都必须将它们添加到 Subject
。Principal
作为成功认证过程的一部分被添加到 Subject
。 同样,如果认证失败,则从 Subject
中除去 Principal
。 不管认证成功与否,当应用程序执行注销时,将除去所有 Principal
。Principal
外,Subject
还可以包含两组凭证:公用和专用。credential 是密码、密钥和令牌等。对公用和专用凭证集的访问是由 Java 特权控制的, 稍后,我们将在本教程中讨论它。对凭证的完整讨论超出了本教程的范围。Subject
对象有几个方法,其中一些方法如下:
subject.getPrincipals()
返回一组 Principal
对象。因为结果是 Set
,所以适用操作remove()
、add()
和 contains()
。subject.getPublicCredentials()
返回一组与 Subject
相关的公用可访问凭证。subject.getPrivateCredentials()
返回一组与 Subject
相关的专用可访问凭证。Principal
是一个 Java 接口。程序员编写的 PrincipalImpl
对象与 Serializable
接口、名称字符串、返回该字符串的 getName()
方法以及其它支持方法(如 hashCode()
、toString()
和 equals()
)一起实现Principal
接口。Principal
被添加到 Subject
。正如我们稍后将看到的那样, 声明性授权基于策略文件中的项。进行授权请求时,将系统的授权策略与包含在 Subject
中的 Principal
进行比较。如果 Subject
有一个满足策略文件中安全性需求的 Principal
,则授权;否则拒绝。PrincipalImpl
。import java.io.Serializable;
import java.security.
Principal
;
//
// This class defines the principle object, which is just an encapsulated
// String name
public class PrincipalImpl implements Principal, Serializable {
private String name;
public PrincipalImpl(String n) {
name = n;
}
public boolean equals(Object obj) {
if (!(obj instanceof PrincipalImpl)) {
return false;
}
PrincipalImpl pobj = (PrincipalImpl)obj;
if (name.equals(pobj.getName())) {
return true;
}
return false;
}
public String getName() {
return name;
}
public int hashCode() {
return name.hashCode();
}
public String toString() {
return getName();
}
}
Subject
需要的认证过程种类、它们的执行顺序以及在Subject
被认为是已认证的之前要求的认证成功或失败的组合。login.config
文件是在 Java 执行命令行上用特性 -Djava.security.auth.login.config==login.config
指定的。Java 有缺省登录配置文件,所以双等于号(==
)替换系统登录配置文件。如果使用一个等于号,login.config 文件将被添加到(而不是替换)系统登录配置文件。因为我们不知道您的系统文件中可能会有什么, 所以我们这样做来确保对于各种各样的教程用户都可以得到可靠的结果。LoginContext
构造器中引用的文本字符串和登录过程列表。 几个参数用于指定一个给定的登录过程的成功或失败对总体认证过程的影响。 有如下参数:
required
表示登录模块必须成功。即使它不成功,还将调用其它登录模块。optional
表示登录模块可以失败,但如果另一个登录模块成功,总体登录仍可以成功。 如果所有登录模块都是可选的,那么要使整个认证成功至少必须有一个模块是成功的。requisite
表示登录模块必须成功,而且如果它失败,将不调用其它登录模块。sufficient
表示如果登录模块成功,则总体登录将成功,同时假设没有其它必需或必不可少的登录模块失败。JAASExample {
AlwaysLoginModule required;
PasswordLoginModule optional;
};
AlwaysLoginModule
必须成功,而 PasswordLoginModule
可以成功也可以失败。
这不是一种现实的情形,稍后我们将修改这些参数来查看不同的配置如何更改代码行为。
对于这项登录配置技术,应该认识到它将所有主要决定(如所需的认证类型和认证成功或失败的特定标准)都留到建立部署时决定,这很重要。 成功的登录将导致新的 Subject
添加到 LoginContext
, 同时将所有成功认证的 Principal
添加到该 Subject
。LoginContext
是一种用于设置登录过程的 Java 类,它进行实际的登录,如果登录成功,获取 Subject
。 它有如下四种主要方法:
LoginContext("JAASExample", newUsernamePasswoerdCallbackHandler())
是构造器。 它把 login.config 文件中使用的字符串作为其第一个参数,把执行实际任务的回调处理程序作为其第二个参数。 (接下来,我们将讨论回调处理程序。)login()
,它根据 login.config 文件中指定的规则实际尝试登录。getSubject()
,如果登录总体成功,它返回经认证的 Subject
。logout()
,它向 LoginContext
注销 Subject
。CallbackHandler
是在 LoginContext
对象的构造函数中指定的。在本教程中,回调处理程序使用几个提示来获取用户的用户名和密码信息。 从登录模块调用的处理程序的 handle()
方法将 Callback
数组对象作为其参数。在登录期间,处理程序遍历 Callback
数组。handle()
方法检查 Callback
对象的类型并执行适当的用户操作。Callback
类型如下:
NameCallback
PasswordCallback
TextInputCallback
TextOutputCallback
LanguageCallback
ChoiceCallback
ConfirmationCallback
LoginContext
对象中的 CallbackHandler
参数将是空的。UsernamePasswordCallbackHandler
的代码。它由 AlwaysLoginModule
调用一次(仅一次回调以获取用户标识),由 PasswordLoginModule
调用一次(两次回调以获取用户标识和密码)。import java.io.*;
import java.security.*;
import javax.security.auth.*;
import javax.security.auth.callback.*;
//
// This class implements a username/password callback handler that gets
// information from the user
public class UsernamePasswordCallbackHandler implements CallbackHandler {
//
// The handle method does all the work and iterates through the array
// of callbacks, examines the type, and takes the appropriate user
// interaction action.
public void handle(Callback[] callbacks) throws
UnsupportedCallbackException, IOException {
for(int i=0;i<callbacks.length;i++) {
Callback cb = callbacks[i];
//
// Handle username aquisition
if (cb instanceof NameCallback) {
NameCallback nameCallback = (NameCallback)cb;
System.out.print( nameCallback.getPrompt() + "? ");
System.out.flush();
String username = new BufferedReader(
new InputStreamReader(System.in)).readLine();
nameCallback.setName(username);
//
// Handle password aquisition
} else if (cb instanceof PasswordCallback) {
PasswordCallback passwordCallback = (PasswordCallback)cb;
System.out.print( passwordCallback.getPrompt() + "? ");
System.out.flush();
String password = new BufferedReader(
new InputStreamReader(System.in)).readLine();
passwordCallback.setPassword(password.toCharArray());
password = null;
//
// Other callback types are not handled here
} else {
throw new UnsupportedCallbackException(cb, "Unsupported
Callback Type");
}
}
}
}
LoginModule
是参与 JAAS 认证过程所需的方法的接口。 因为可能要到执行其它登录过程时才知道特定登录过程是成功还是失败,所以用两阶段提交过程来确定是否成功。 下列方法由 LoginModule
对象实现:
initialize( subject, callbackHandler, sharedState, options)
初始化 LoginModule
。(注:对sharedState
和 options
的讨论超出了本教程的范围。)login()
设置任何必需的回调,调用 CallbackHandler
来处理它们, 并将返回的信息(即用户名和密码)与允许值进行比较。如果匹配,则登录模块成功, 尽管仍可能因为另一个登录模块不成功而异常终止它,这取决于 login.config 文件中的设置。commit()
作为两阶段提交过程的一部分被调用以确定是否成功。 如果根据 login.config 文件中指定的约束,所有登录模块都是成功的, 那么新的 Principal
随同用户名一起创建,并被添加到 Subject
的主体集。abort()
,如果总体登录未成功,则调用它;如果发生异常终止,必须清除内部的 LoginModule
状态。logout()
被调用以除去 Subject
的主体集中的 Principal
并执行其它内部状态清除。AlwaysLoginModule
,它始终是成功的。 第二个是PasswordLoginModule
,仅当用户标识和密码与某些硬编码值匹配时,它才会成功。 虽然两个示例模块都不是合乎实际的实现,但它们共同演示了各种 JAAS 选项的结果。AlwaysLoginModule
认证将始终成功, 所以实际上它仅用于通过 NameCallback
函数获取用户名。 假设其它登录模块都成功,AlwaysLoginModule
的 commit()
方法将创建一个带用户名的新 PrincipalImpl
对象并将它添加到 Subject
的 Principal
集中。注销将除去 Subject
的 Principal
集 中的 PrincipalImpl
。import java.security.*;
import javax.security.auth.*;
import javax.security.auth.spi.*;
import javax.security.auth.callback.*;
import javax.security.auth.login.*;
import java.io.*;
import java.util.*;
// This is a JAAS Login Module that always succeeds. While not realistic,
// it is designed to illustrate the bare bones structure of a Login Module
// and is used in examples that show the login configuration file
// operation.
public class AlwaysLoginModule implements LoginModule {
private
Subject
subject;
private Principal
principal;
private CallbackHandler callbackHandler;
private String username;
private boolean loginSuccess;
//
// Initialize sets up the login module. sharedState and options are
// advanced features not used here
public void initialize(Subject
sub, CallbackHandler cbh,
Map sharedState, Map options) {
subject = sub;
callbackHandler = cbh;
loginSuccess = false;
}
//
// The login phase gets the userid from the user
public boolean login() throws LoginException {
//
// Since we need input from a user, we need a callback handler
if (callbackHandler == null) {
throw new LoginException( "No CallbackHandler defined");
}
Callback[] callbacks = new Callback[1];
callbacks[0] = new NameCallback("Username");
//
// Call the callback handler to get the username
try {
System.out.println( "\nAlwaysLoginModule Login" );
callbackHandler.handle(callbacks);
username = ((NameCallback)callbacks[0]).getName();
} catch (IOException ioe) {
throw new LoginException(ioe.toString());
} catch (UnsupportedCallbackException uce) {
throw new LoginException(uce.toString());
}
loginSuccess = true;
System.out.println();
System.out.println( "Login: AlwaysLoginModule SUCCESS" );
return true;
}
//
// The commit phase adds the principal if both the overall authentication
// succeeds (which is why commit was called) as well as this particular
// login module
public boolean commit() throws LoginException {
//
// Check to see if this login module succeeded (which it always will
// in this example)
if (loginSuccess == false) {
System.out.println( "Commit: AlwaysLoginModule FAIL" );
return false;
}
//
// If this login module succeeded too, then add the new principal
// to the subject (if it does not already exist)
principal = new PrincipalImpl(username);
if (!(subject.getPrincipals().contains(principal))) {
subject.getPrincipals().add(principal);
}
System.out.println( "Commit: AlwaysLoginModule SUCCESS" );
return true;
}
//
// The abort phase is called if the overall authentication fails, so
// we have to clean up the internal state
public boolean abort() throws LoginException {
if (loginSuccess == false) {
System.out.println( "Abort: AlwaysLoginModule FAIL" );
principal = null;
return false;
}
System.out.println( "Abort: AlwaysLoginModule SUCCESS" );
logout();
return true;
}
//
// The logout phase cleans up the state
public boolean logout() throws LoginException {
subject.getPrincipals().remove(principal);
loginSuccess = false;
principal = null;
System.out.println( "Logout: AlwaysLoginModule SUCCESS" );
return true;
}
}
PasswordLoginModule
使用 NameCallback
来获取用户名并使用 PasswordCallback
来获取密码。如果用户名是“joeuser”,密码是“joe”, 则该认证将成功。import java.security.*;
import javax.security.auth.*;
import javax.security.auth.spi.*;
import javax.security.auth.callback.*;
import javax.security.auth.login.*;
import java.io.*;
import java.util.*;
//
// This is a JAAS Login Module that requires both a username and a
// password. The username must equal the hardcoded "joeuser" and
// the password must match the hardcoded "joeuserpw".
public class PasswordLoginModule implements LoginModule {
private
Subject
subject;
private Principal
principal;
private CallbackHandler callbackHandler;
private String username;
private char[] password;
private boolean loginSuccess;
//
// Initialize sets up the login module. sharedState and options are
// advanced features not used here
public void initialize(Subject
sub, CallbackHandler cbh,
Map sharedState,Map options) {
subject = sub;
callbackHandler = cbh;
loginSuccess = false;
username = null;
clearPassword();
}
//
// The login phase gets the userid and password from the user and
// compares them to the hardcoded values "joeuser" and "joeuserpw".
public boolean login() throws LoginException {
//
// Since we need input from a user, we need a callback handler
if (callbackHandler == null) {
throw new LoginException("No CallbackHandler defined");
}
Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback("Username");
callbacks[1] = new PasswordCallback("Password", false);
//
// Call t
发表评论
-
自增 自减 java和c的区别
2012-03-10 15:57 1441JAVA public class Test { ... -
瞎聊系统性能优化
2012-02-19 23:46 1145一个系统中影响性能的无非就是CPU计算能力,磁盘、网络的读写能 ... -
在tomcat中,通过IP访问web系统,不需要端口号的方法(转)
2012-02-06 11:10 8885源文章地址:http://sinian.iteye.com/b ... -
java 编码
2012-02-02 18:23 1166先看一个字符串 String str = &qu ... -
javassist与classLoader
2012-02-02 15:22 4292javassist.jar是个非常 ... -
tcp 和 java socket
2011-12-31 12:52 2815tcp socket 总结点 1 ... -
netty 疑惑
2011-12-01 18:27 2703netty的nio 模式如下 一个线程Boss使用 ... -
Apache Tomcat http_proxy 连接方式配置
2011-11-02 18:03 56041、安装Tomcat ,为了使域名保持一致,在conf\Cat ... -
谈线程池
2011-10-27 12:47 1520线程池原理:用指定数 ... -
设置tomcat启动参数
2011-09-15 16:58 1524window: 在catalina.bat 文件的开始处添加如 ... -
通过反汇编class看i++和++i的区别
2011-08-17 14:32 2108public void method4() ... -
hotspot 控制参数
2011-08-17 09:25 1301文档来源于 http://www.oracle.com ... -
Spring 事务异常回滚
2011-08-16 10:10 11133先看如下代码 @Transactional ... -
java IO和NIO测试
2011-08-11 12:08 1608测试环境:cpu:Q9500 4核 频率2.83GHZ ... -
静态锁和实例锁
2011-07-28 18:21 1950Java中可以对静态方法和实例方法使用synchroni ... -
BASE64 和Dom4j
2011-07-20 09:45 1301项目当中用到MD5做消息摘要,后通过BASE64转成字符 ... -
jetty httpServer和java6内置httpServer比较
2011-07-19 12:03 3059测试情况是客户端100个线程同时同时请求10000次,服务器端 ... -
Jetty HttpClent 异常
2011-07-15 13:48 1233使用Jetty HttpClent做异步请求,结果发现这 ... -
关于Hibernate延迟加载
2011-07-14 17:42 1085package com.lottery.test; ... -
Jetty内嵌Http服务器
2011-07-14 11:13 3389本例只是以HttpServlet方式实现,更多的方式可以通过h ...
相关推荐
shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权 传统使用URL拦截的时候,要将所有的URL都配置起来,繁琐、不易维护 而我们的Shiro实现系统的权限管理,有效提高开发效率,从而...
Tomcat是一个流行的开源Java Servlet容器,它提供了内置的安全功能,包括用户认证和授权,这些功能是通过“域”这一概念来实现的。 域在Tomcat中是一个用户数据库,类似于Unix中的用户群组。它存储了用户信息,包括...
安全通道协议是在智能卡与外界设备通信时,保证数据传输的安全性。它确保了通信数据的机密性、完整性和认证性。SCP03使用特定密钥加密数据,这些密钥在安全域中管理,安全域可以理解为卡片上相对独立的安全存储空间...
总之,这个“简单发布到Twitter的脚本”是一个帮助开发者轻松实现本地内容同步到Twitter的工具,通过OAuth确保安全性,而提供的源码则有助于进一步学习和自定义。如果你正在寻找一种方式将本地系统(比如个人博客)...
5. **安全性**:介绍了 Java EE 6 中的安全性框架,包括认证、授权和加密机制。 6. **批处理和调度**:讨论了使用 Java Batch 和 Java EE 6 的定时任务机制来进行批量数据处理和任务调度的方法。 7. **消息传递**:...
影子库可以用于测试和验证新功能,而数据加密则保证了敏感数据的安全性。 5. **SPI扩展**:ShardingSphere的SPI(Service Provider Interface)机制允许开发者自定义扩展,比如分片策略、事务管理器等,以适应特定...
2. **Project Tango** (也称作Tango)—— 实现了可靠性、安全性和事务处理相关的WS-*规范,并支持与.NET 3.0的互操作性。 **Java API for XML Web Services (JAX-WS) RI** 提供了核心Web服务平台,包括所有SOAP...
Seam 提供了一套强大的安全机制,包括认证、授权和加密等功能,以确保应用程序的安全性。 - **Ajax 和 JavaScript 远程调用**:Seam 支持 AJAX 和 JavaScript 远程调用,这意味着开发者可以构建响应迅速且用户体验...
9. **安全性考虑**:开发Web服务时,安全性是一个重要的方面,包括认证、授权、加密等,需要了解如何在PB9和EAServer中实现这些安全机制。 10. **性能优化**:理解如何优化Web服务的性能,包括服务响应时间、并发...
- 在右侧找到“Java 认证和授权服务”>“J2C 认证数据”。 - 进入“全局安全性”>“JAAS-J2C认证数据”。 - 点击“新建”按钮进行新认证的创建。 - 输入必要的用户名和密码信息,并点击“应用”及“保存”按钮...
- **安全认证**:设置身份验证和授权机制保障数据安全。 #### 十、总结 通过本文档的学习,读者可以了解到Elasticsearch的基本概念、部署流程以及相关的运维知识。在实际操作过程中,还需要结合具体的业务场景进行...
### BusinessObjects Integration Kit for SAP – 安装与配置详解 #### 概述 BusinessObjects Integration Kit for SAP 是一套专门设计用于集成 SAP 和 BusinessObjects 平台的工具包。该工具包使得用户能够在 SAP...
总的来说,Spring框架的众多组件和相关技术为构建现代化的Java应用提供了强大的支持,从反应式编程到微服务架构,再到安全性和分布式系统的其他方面,Spring的生态系统不断地扩展着Java开发者的能力范围。...
由国内著名技术社区联合推荐的2012年IT技术力作:《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》,即将上架发行,此书从Web应用、数据备份与恢复、网络存储应用、运维监控与性能优化、集群高级应用等...
Apache Shiro是Java的安全框架,负责身份认证、授权(权限控制)、会话管理和安全加密等功能。在AuthManager中,Shiro扮演着核心角色,它处理用户的登录验证,提供基于角色的访问控制(RBAC),并能实现记住我、密码...
- 多因素认证:支持多种MFA(多因素认证)机制,增加安全性。 - 开放标准支持:遵循OAuth 2.0、OpenID Connect等开放标准,易于与其他系统集成。 2. **Keycloak工作原理**: - Keycloak服务器作为身份服务,处理...
2. **配置安全**:根据企业的安全策略,设置MQ的用户认证、权限和SSL/TLS加密。 3. **创建队列管理器**:使用MQ的命令行工具创建队列管理器,定义队列和通道,以支持消息传输。 4. **远程队列管理**:在Windows...
- **基于JAAS的验证**: 利用Java Authentication and Authorization Service(JAAS)提供的API来进行用户的认证和授权。 - **基于JAAS的授权**: 根据用户的角色和权限来决定其访问权限。 - **配置**: 配置文件中...
总结来说,Filter 在 JavaWeb 开发中扮演着至关重要的角色,它们帮助开发者实现诸如认证、授权、数据校验、性能优化等多种功能,提高了应用程序的安全性和可维护性。理解并熟练运用 Filter,能显著提升 JavaWeb 应用...